x11: Split out xsettings string reading code
This commit is contained in:
		| @ -187,6 +187,24 @@ fetch_card8 (XSettingsBuffer *buffer, | |||||||
|  |  | ||||||
| #define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1))) | #define XSETTINGS_PAD(n,m) ((n + m - 1) & (~(m-1))) | ||||||
|  |  | ||||||
|  | static XSettingsResult | ||||||
|  | fetch_string (XSettingsBuffer  *buffer, | ||||||
|  |               guint             length, | ||||||
|  |               char            **result) | ||||||
|  | { | ||||||
|  |   guint pad_len; | ||||||
|  |  | ||||||
|  |   pad_len = XSETTINGS_PAD (length, 4); | ||||||
|  |   if (pad_len < length /* guard against overflow */ | ||||||
|  |       || BYTES_LEFT (buffer) < pad_len) | ||||||
|  |     return XSETTINGS_ACCESS; | ||||||
|  |  | ||||||
|  |   *result = g_strndup ((char *) buffer->pos, length); | ||||||
|  |   buffer->pos += pad_len; | ||||||
|  |  | ||||||
|  |   return XSETTINGS_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
| static GHashTable * | static GHashTable * | ||||||
| parse_settings (unsigned char *data, | parse_settings (unsigned char *data, | ||||||
| 		size_t         len) | 		size_t         len) | ||||||
| @ -228,7 +246,6 @@ parse_settings (unsigned char *data, | |||||||
|       CARD8 type; |       CARD8 type; | ||||||
|       CARD16 name_len; |       CARD16 name_len; | ||||||
|       CARD32 v_int; |       CARD32 v_int; | ||||||
|       size_t pad_len; |  | ||||||
|        |        | ||||||
|       result = fetch_card8 (&buffer, &type); |       result = fetch_card8 (&buffer, &type); | ||||||
|       if (result != XSETTINGS_SUCCESS) |       if (result != XSETTINGS_SUCCESS) | ||||||
| @ -240,21 +257,13 @@ parse_settings (unsigned char *data, | |||||||
|       if (result != XSETTINGS_SUCCESS) |       if (result != XSETTINGS_SUCCESS) | ||||||
| 	goto out; | 	goto out; | ||||||
|  |  | ||||||
|       pad_len = XSETTINGS_PAD(name_len, 4); |  | ||||||
|       if (BYTES_LEFT (&buffer) < pad_len) |  | ||||||
| 	{ |  | ||||||
| 	  result = XSETTINGS_ACCESS; |  | ||||||
| 	  goto out; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
|       setting = g_new (XSettingsSetting, 1); |       setting = g_new (XSettingsSetting, 1); | ||||||
|       setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */ |       setting->type = XSETTINGS_TYPE_INT; /* No allocated memory */ | ||||||
|  |  | ||||||
|       setting->name = g_malloc (name_len + 1); |       setting->name = NULL; | ||||||
|  |       result = fetch_string (&buffer, name_len, &setting->name); | ||||||
|       memcpy (setting->name, buffer.pos, name_len); |       if (result != XSETTINGS_SUCCESS) | ||||||
|       setting->name[name_len] = '\0'; | 	goto out; | ||||||
|       buffer.pos += pad_len; |  | ||||||
|  |  | ||||||
|       /* last change serial (we ignore it) */ |       /* last change serial (we ignore it) */ | ||||||
|       result = fetch_card32 (&buffer, &v_int); |       result = fetch_card32 (&buffer, &v_int); | ||||||
| @ -276,20 +285,10 @@ parse_settings (unsigned char *data, | |||||||
| 	  if (result != XSETTINGS_SUCCESS) | 	  if (result != XSETTINGS_SUCCESS) | ||||||
| 	    goto out; | 	    goto out; | ||||||
|  |  | ||||||
| 	  pad_len = XSETTINGS_PAD (v_int, 4); |           result = fetch_string (&buffer, v_int, &setting->data.v_string); | ||||||
| 	  if (v_int + 1 == 0 || /* Guard against wrap-around */ |           if (result != XSETTINGS_SUCCESS) | ||||||
| 	      BYTES_LEFT (&buffer) < pad_len) |             goto out; | ||||||
| 	    { |  | ||||||
| 	      result = XSETTINGS_ACCESS; |  | ||||||
| 	      goto out; |  | ||||||
| 	    } |  | ||||||
|  |  | ||||||
| 	  setting->data.v_string = g_malloc (v_int + 1); |  | ||||||
| 	   | 	   | ||||||
| 	  memcpy (setting->data.v_string, buffer.pos, v_int); |  | ||||||
| 	  setting->data.v_string[v_int] = '\0'; |  | ||||||
| 	  buffer.pos += pad_len; |  | ||||||
|  |  | ||||||
|           GDK_NOTE(SETTINGS, g_print("  %s = \"%s\"\n", setting->name, setting->data.v_string)); |           GDK_NOTE(SETTINGS, g_print("  %s = \"%s\"\n", setting->name, setting->data.v_string)); | ||||||
| 	  break; | 	  break; | ||||||
| 	case XSETTINGS_TYPE_COLOR: | 	case XSETTINGS_TYPE_COLOR: | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Benjamin Otte
					Benjamin Otte