| 112 { |
112 { |
| 113 char *bytes = Tcl_GetStringFromObj(obj, NULL); |
113 char *bytes = Tcl_GetStringFromObj(obj, NULL); |
| 114 char *ptr; |
114 char *ptr; |
| 115 PurpleStringref *type; |
115 PurpleStringref *type; |
| 116 void *value; |
116 void *value; |
| 117 int magicnumber = strlen("purple-"); |
117 static const char const *prefix = "purple-"; |
| |
118 static const int prefixlen = sizeof(prefix) - 1; |
| 118 |
119 |
| 119 if (strlen(bytes) < magicnumber |
120 if (strlen(bytes) < prefixlen |
| 120 || strncmp(bytes, "purple-", magicnumber) |
121 || strncmp(bytes, prefix, prefixlen) |
| 121 || (ptr = strchr(bytes, ':')) == NULL |
122 || (ptr = strchr(bytes, ':')) == NULL |
| 122 || (ptr - bytes) == magicnumber) |
123 || (ptr - bytes) == prefixlen) |
| 123 goto badobject; |
124 goto badobject; |
| 124 |
125 |
| 125 /* Bad Ethan */ |
126 /* Bad Ethan */ |
| 126 *ptr = '\0'; |
127 *ptr = '\0'; |
| 127 type = purple_stringref_new(bytes + magicnumber); |
128 type = purple_stringref_new(bytes + prefixlen); |
| 128 *ptr = ':'; |
129 *ptr = ':'; |
| 129 ptr++; |
130 ptr++; |
| 130 |
131 |
| 131 if (sscanf(ptr, "%p", &value) == 0) { |
132 if (sscanf(ptr, "%p", &value) == 0) { |
| 132 purple_stringref_unref(type); |
133 purple_stringref_unref(type); |