debuggers.hg
annotate xen/common/string.c @ 22855:1d1eec7e1fb4
xl: Perform minimal validation of virtual disk file while parsing config file
This patch performs some very basic validation on the virtual disk
file passed through the config file. This validation ensures that we
don't go too far with the initialization like spawn qemu and more
while there could be some potentially fundamental issues.
[ Patch fixed up to work with PHYSTYPE_EMPTY 22808:6ec61438713a -iwj ]
Signed-off-by: Kamala Narasimhan <kamala.narasimhan@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This patch performs some very basic validation on the virtual disk
file passed through the config file. This validation ensures that we
don't go too far with the initialization like spawn qemu and more
while there could be some potentially fundamental issues.
[ Patch fixed up to work with PHYSTYPE_EMPTY 22808:6ec61438713a -iwj ]
Signed-off-by: Kamala Narasimhan <kamala.narasimhan@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
author | Kamala Narasimhan <kamala.narasimhan@gmail.com> |
---|---|
date | Tue Jan 25 18:09:49 2011 +0000 (2011-01-25) |
parents | 9fd36167ecfa |
children |
rev | line source |
---|---|
jws@381 | 1 /* |
jws@381 | 2 * linux/lib/string.c |
jws@381 | 3 * |
jws@381 | 4 * Copyright (C) 1991, 1992 Linus Torvalds |
jws@381 | 5 */ |
jws@381 | 6 |
kaf24@1248 | 7 #include <xen/types.h> |
kaf24@1248 | 8 #include <xen/string.h> |
kaf24@1248 | 9 #include <xen/ctype.h> |
jws@381 | 10 |
jws@381 | 11 #ifndef __HAVE_ARCH_STRNICMP |
jws@381 | 12 /** |
jws@381 | 13 * strnicmp - Case insensitive, length-limited string comparison |
jws@381 | 14 * @s1: One string |
jws@381 | 15 * @s2: The other string |
jws@381 | 16 * @len: the maximum number of characters to compare |
jws@381 | 17 */ |
jws@381 | 18 int strnicmp(const char *s1, const char *s2, size_t len) |
jws@381 | 19 { |
jws@381 | 20 /* Yes, Virginia, it had better be unsigned */ |
jws@381 | 21 unsigned char c1, c2; |
jws@381 | 22 |
jws@381 | 23 c1 = 0; c2 = 0; |
jws@381 | 24 if (len) { |
jws@381 | 25 do { |
jws@381 | 26 c1 = *s1; c2 = *s2; |
jws@381 | 27 s1++; s2++; |
jws@381 | 28 if (!c1) |
jws@381 | 29 break; |
jws@381 | 30 if (!c2) |
jws@381 | 31 break; |
jws@381 | 32 if (c1 == c2) |
jws@381 | 33 continue; |
jws@381 | 34 c1 = tolower(c1); |
jws@381 | 35 c2 = tolower(c2); |
jws@381 | 36 if (c1 != c2) |
jws@381 | 37 break; |
jws@381 | 38 } while (--len); |
jws@381 | 39 } |
jws@381 | 40 return (int)c1 - (int)c2; |
jws@381 | 41 } |
jws@381 | 42 #endif |
jws@381 | 43 |
kaf24@3475 | 44 #ifndef __HAVE_ARCH_STRLCPY |
kaf24@3475 | 45 /** |
kaf24@3475 | 46 * strlcpy - Copy a %NUL terminated string into a sized buffer |
kaf24@3475 | 47 * @dest: Where to copy the string to |
kaf24@3475 | 48 * @src: Where to copy the string from |
kaf24@3475 | 49 * @size: size of destination buffer |
kaf24@3475 | 50 * |
kaf24@3475 | 51 * Compatible with *BSD: the result is always a valid |
kaf24@3475 | 52 * NUL-terminated string that fits in the buffer (unless, |
kaf24@3475 | 53 * of course, the buffer size is zero). It does not pad |
kaf24@3475 | 54 * out the result like strncpy() does. |
kaf24@3475 | 55 */ |
kaf24@3475 | 56 size_t strlcpy(char *dest, const char *src, size_t size) |
kaf24@3475 | 57 { |
kaf24@3475 | 58 size_t ret = strlen(src); |
kaf24@3475 | 59 |
kaf24@3475 | 60 if (size) { |
kaf24@3475 | 61 size_t len = (ret >= size) ? size-1 : ret; |
kaf24@3475 | 62 memcpy(dest, src, len); |
kaf24@3475 | 63 dest[len] = '\0'; |
kaf24@3475 | 64 } |
kaf24@3475 | 65 return ret; |
kaf24@3475 | 66 } |
kaf24@3475 | 67 EXPORT_SYMBOL(strlcpy); |
kaf24@3475 | 68 #endif |
kaf24@3475 | 69 |
kfraser@13703 | 70 #ifndef __HAVE_ARCH_STRLCAT |
jws@381 | 71 /** |
kfraser@13703 | 72 * strlcat - Append a %NUL terminated string into a sized buffer |
kfraser@13703 | 73 * @dest: Where to copy the string to |
kfraser@13703 | 74 * @src: Where to copy the string from |
kfraser@13703 | 75 * @size: size of destination buffer |
jws@381 | 76 * |
kfraser@13703 | 77 * Compatible with *BSD: the result is always a valid |
kfraser@13703 | 78 * NUL-terminated string that fits in the buffer (unless, |
kfraser@13703 | 79 * of course, the buffer size is zero). |
jws@381 | 80 */ |
kfraser@13703 | 81 size_t strlcat(char *dest, const char *src, size_t size) |
jws@381 | 82 { |
kfraser@13703 | 83 size_t slen = strlen(src); |
kfraser@13703 | 84 size_t dlen = strnlen(dest, size); |
kfraser@13703 | 85 char *p = dest + dlen; |
jws@381 | 86 |
kfraser@13703 | 87 while ((p - dest) < size) |
kfraser@13703 | 88 if ((*p++ = *src++) == '\0') |
kfraser@13703 | 89 break; |
jws@381 | 90 |
kfraser@13703 | 91 if (dlen < size) |
kfraser@13703 | 92 *(p-1) = '\0'; |
kfraser@13703 | 93 |
kfraser@13703 | 94 return slen + dlen; |
jws@381 | 95 } |
kfraser@13703 | 96 EXPORT_SYMBOL(strlcat); |
jws@381 | 97 #endif |
jws@381 | 98 |
jws@381 | 99 #ifndef __HAVE_ARCH_STRCMP |
jws@381 | 100 /** |
jws@381 | 101 * strcmp - Compare two strings |
jws@381 | 102 * @cs: One string |
jws@381 | 103 * @ct: Another string |
jws@381 | 104 */ |
jws@381 | 105 int strcmp(const char * cs,const char * ct) |
jws@381 | 106 { |
jws@381 | 107 register signed char __res; |
jws@381 | 108 |
jws@381 | 109 while (1) { |
jws@381 | 110 if ((__res = *cs - *ct++) != 0 || !*cs++) |
jws@381 | 111 break; |
jws@381 | 112 } |
jws@381 | 113 |
jws@381 | 114 return __res; |
jws@381 | 115 } |
jws@381 | 116 #endif |
jws@381 | 117 |
jws@381 | 118 #ifndef __HAVE_ARCH_STRNCMP |
jws@381 | 119 /** |
jws@381 | 120 * strncmp - Compare two length-limited strings |
jws@381 | 121 * @cs: One string |
jws@381 | 122 * @ct: Another string |
jws@381 | 123 * @count: The maximum number of bytes to compare |
jws@381 | 124 */ |
jws@381 | 125 int strncmp(const char * cs,const char * ct,size_t count) |
jws@381 | 126 { |
jws@381 | 127 register signed char __res = 0; |
jws@381 | 128 |
jws@381 | 129 while (count) { |
jws@381 | 130 if ((__res = *cs - *ct++) != 0 || !*cs++) |
jws@381 | 131 break; |
jws@381 | 132 count--; |
jws@381 | 133 } |
jws@381 | 134 |
jws@381 | 135 return __res; |
jws@381 | 136 } |
jws@381 | 137 #endif |
jws@381 | 138 |
jws@381 | 139 #ifndef __HAVE_ARCH_STRCHR |
jws@381 | 140 /** |
jws@381 | 141 * strchr - Find the first occurrence of a character in a string |
jws@381 | 142 * @s: The string to be searched |
jws@381 | 143 * @c: The character to search for |
jws@381 | 144 */ |
jws@381 | 145 char * strchr(const char * s, int c) |
jws@381 | 146 { |
jws@381 | 147 for(; *s != (char) c; ++s) |
jws@381 | 148 if (*s == '\0') |
jws@381 | 149 return NULL; |
jws@381 | 150 return (char *) s; |
jws@381 | 151 } |
jws@381 | 152 #endif |
jws@381 | 153 |
jws@381 | 154 #ifndef __HAVE_ARCH_STRRCHR |
jws@381 | 155 /** |
jws@381 | 156 * strrchr - Find the last occurrence of a character in a string |
jws@381 | 157 * @s: The string to be searched |
jws@381 | 158 * @c: The character to search for |
jws@381 | 159 */ |
jws@381 | 160 char * strrchr(const char * s, int c) |
jws@381 | 161 { |
jws@381 | 162 const char *p = s + strlen(s); |
jws@381 | 163 do { |
jws@381 | 164 if (*p == (char)c) |
jws@381 | 165 return (char *)p; |
jws@381 | 166 } while (--p >= s); |
jws@381 | 167 return NULL; |
jws@381 | 168 } |
jws@381 | 169 #endif |
jws@381 | 170 |
jws@381 | 171 #ifndef __HAVE_ARCH_STRLEN |
jws@381 | 172 /** |
jws@381 | 173 * strlen - Find the length of a string |
jws@381 | 174 * @s: The string to be sized |
jws@381 | 175 */ |
jws@381 | 176 size_t strlen(const char * s) |
jws@381 | 177 { |
jws@381 | 178 const char *sc; |
jws@381 | 179 |
jws@381 | 180 for (sc = s; *sc != '\0'; ++sc) |
jws@381 | 181 /* nothing */; |
jws@381 | 182 return sc - s; |
jws@381 | 183 } |
jws@381 | 184 #endif |
jws@381 | 185 |
jws@381 | 186 #ifndef __HAVE_ARCH_STRNLEN |
jws@381 | 187 /** |
jws@381 | 188 * strnlen - Find the length of a length-limited string |
jws@381 | 189 * @s: The string to be sized |
jws@381 | 190 * @count: The maximum number of bytes to search |
jws@381 | 191 */ |
jws@381 | 192 size_t strnlen(const char * s, size_t count) |
jws@381 | 193 { |
jws@381 | 194 const char *sc; |
jws@381 | 195 |
jws@381 | 196 for (sc = s; count-- && *sc != '\0'; ++sc) |
jws@381 | 197 /* nothing */; |
jws@381 | 198 return sc - s; |
jws@381 | 199 } |
jws@381 | 200 #endif |
jws@381 | 201 |
jws@381 | 202 #ifndef __HAVE_ARCH_STRSPN |
jws@381 | 203 /** |
jws@381 | 204 * strspn - Calculate the length of the initial substring of @s which only |
jws@381 | 205 * contain letters in @accept |
jws@381 | 206 * @s: The string to be searched |
jws@381 | 207 * @accept: The string to search for |
jws@381 | 208 */ |
jws@381 | 209 size_t strspn(const char *s, const char *accept) |
jws@381 | 210 { |
jws@381 | 211 const char *p; |
jws@381 | 212 const char *a; |
jws@381 | 213 size_t count = 0; |
jws@381 | 214 |
jws@381 | 215 for (p = s; *p != '\0'; ++p) { |
jws@381 | 216 for (a = accept; *a != '\0'; ++a) { |
jws@381 | 217 if (*p == *a) |
jws@381 | 218 break; |
jws@381 | 219 } |
jws@381 | 220 if (*a == '\0') |
jws@381 | 221 return count; |
jws@381 | 222 ++count; |
jws@381 | 223 } |
jws@381 | 224 |
jws@381 | 225 return count; |
jws@381 | 226 } |
jws@381 | 227 #endif |
jws@381 | 228 |
jws@381 | 229 #ifndef __HAVE_ARCH_STRPBRK |
jws@381 | 230 /** |
jws@381 | 231 * strpbrk - Find the first occurrence of a set of characters |
jws@381 | 232 * @cs: The string to be searched |
jws@381 | 233 * @ct: The characters to search for |
jws@381 | 234 */ |
jws@381 | 235 char * strpbrk(const char * cs,const char * ct) |
jws@381 | 236 { |
jws@381 | 237 const char *sc1,*sc2; |
jws@381 | 238 |
jws@381 | 239 for( sc1 = cs; *sc1 != '\0'; ++sc1) { |
jws@381 | 240 for( sc2 = ct; *sc2 != '\0'; ++sc2) { |
jws@381 | 241 if (*sc1 == *sc2) |
jws@381 | 242 return (char *) sc1; |
jws@381 | 243 } |
jws@381 | 244 } |
jws@381 | 245 return NULL; |
jws@381 | 246 } |
jws@381 | 247 #endif |
jws@381 | 248 |
jws@381 | 249 #ifndef __HAVE_ARCH_STRSEP |
jws@381 | 250 /** |
jws@381 | 251 * strsep - Split a string into tokens |
jws@381 | 252 * @s: The string to be searched |
jws@381 | 253 * @ct: The characters to search for |
jws@381 | 254 * |
jws@381 | 255 * strsep() updates @s to point after the token, ready for the next call. |
jws@381 | 256 * |
jws@381 | 257 * It returns empty tokens, too, behaving exactly like the libc function |
jws@381 | 258 * of that name. In fact, it was stolen from glibc2 and de-fancy-fied. |
jws@381 | 259 * Same semantics, slimmer shape. ;) |
jws@381 | 260 */ |
jws@381 | 261 char * strsep(char **s, const char *ct) |
jws@381 | 262 { |
jws@381 | 263 char *sbegin = *s, *end; |
jws@381 | 264 |
jws@381 | 265 if (sbegin == NULL) |
jws@381 | 266 return NULL; |
jws@381 | 267 |
jws@381 | 268 end = strpbrk(sbegin, ct); |
jws@381 | 269 if (end) |
jws@381 | 270 *end++ = '\0'; |
jws@381 | 271 *s = end; |
jws@381 | 272 |
jws@381 | 273 return sbegin; |
jws@381 | 274 } |
jws@381 | 275 #endif |
jws@381 | 276 |
jws@381 | 277 #ifndef __HAVE_ARCH_MEMSET |
jws@381 | 278 /** |
jws@381 | 279 * memset - Fill a region of memory with the given value |
jws@381 | 280 * @s: Pointer to the start of the area. |
jws@381 | 281 * @c: The byte to fill the area with |
jws@381 | 282 * @count: The size of the area. |
jws@381 | 283 * |
jws@381 | 284 * Do not use memset() to access IO space, use memset_io() instead. |
jws@381 | 285 */ |
jws@381 | 286 void * memset(void * s,int c,size_t count) |
jws@381 | 287 { |
jws@381 | 288 char *xs = (char *) s; |
jws@381 | 289 |
jws@381 | 290 while (count--) |
jws@381 | 291 *xs++ = c; |
jws@381 | 292 |
jws@381 | 293 return s; |
jws@381 | 294 } |
jws@381 | 295 #endif |
jws@381 | 296 |
kaf24@3466 | 297 #ifndef __HAVE_ARCH_MEMCPY |
jws@381 | 298 /** |
jws@381 | 299 * memcpy - Copy one area of memory to another |
jws@381 | 300 * @dest: Where to copy to |
jws@381 | 301 * @src: Where to copy from |
jws@381 | 302 * @count: The size of the area. |
jws@381 | 303 * |
jws@381 | 304 * You should not use this function to access IO space, use memcpy_toio() |
jws@381 | 305 * or memcpy_fromio() instead. |
jws@381 | 306 */ |
jws@381 | 307 void * memcpy(void * dest,const void *src,size_t count) |
jws@381 | 308 { |
jws@381 | 309 char *tmp = (char *) dest, *s = (char *) src; |
jws@381 | 310 |
jws@381 | 311 while (count--) |
jws@381 | 312 *tmp++ = *s++; |
jws@381 | 313 |
jws@381 | 314 return dest; |
jws@381 | 315 } |
kaf24@3466 | 316 #endif |
jws@381 | 317 |
jws@381 | 318 #ifndef __HAVE_ARCH_MEMMOVE |
jws@381 | 319 /** |
jws@381 | 320 * memmove - Copy one area of memory to another |
jws@381 | 321 * @dest: Where to copy to |
jws@381 | 322 * @src: Where to copy from |
jws@381 | 323 * @count: The size of the area. |
jws@381 | 324 * |
jws@381 | 325 * Unlike memcpy(), memmove() copes with overlapping areas. |
jws@381 | 326 */ |
jws@381 | 327 void * memmove(void * dest,const void *src,size_t count) |
jws@381 | 328 { |
jws@381 | 329 char *tmp, *s; |
jws@381 | 330 |
jws@381 | 331 if (dest <= src) { |
jws@381 | 332 tmp = (char *) dest; |
jws@381 | 333 s = (char *) src; |
jws@381 | 334 while (count--) |
jws@381 | 335 *tmp++ = *s++; |
jws@381 | 336 } |
jws@381 | 337 else { |
jws@381 | 338 tmp = (char *) dest + count; |
jws@381 | 339 s = (char *) src + count; |
jws@381 | 340 while (count--) |
jws@381 | 341 *--tmp = *--s; |
jws@381 | 342 } |
jws@381 | 343 |
jws@381 | 344 return dest; |
jws@381 | 345 } |
jws@381 | 346 #endif |
jws@381 | 347 |
jws@381 | 348 #ifndef __HAVE_ARCH_MEMCMP |
jws@381 | 349 /** |
jws@381 | 350 * memcmp - Compare two areas of memory |
jws@381 | 351 * @cs: One area of memory |
jws@381 | 352 * @ct: Another area of memory |
jws@381 | 353 * @count: The size of the area. |
jws@381 | 354 */ |
jws@381 | 355 int memcmp(const void * cs,const void * ct,size_t count) |
jws@381 | 356 { |
jws@381 | 357 const unsigned char *su1, *su2; |
jws@381 | 358 int res = 0; |
jws@381 | 359 |
jws@381 | 360 for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) |
jws@381 | 361 if ((res = *su1 - *su2) != 0) |
jws@381 | 362 break; |
jws@381 | 363 return res; |
jws@381 | 364 } |
jws@381 | 365 #endif |
jws@381 | 366 |
jws@381 | 367 #ifndef __HAVE_ARCH_MEMSCAN |
jws@381 | 368 /** |
jws@381 | 369 * memscan - Find a character in an area of memory. |
jws@381 | 370 * @addr: The memory area |
jws@381 | 371 * @c: The byte to search for |
jws@381 | 372 * @size: The size of the area. |
jws@381 | 373 * |
jws@381 | 374 * returns the address of the first occurrence of @c, or 1 byte past |
jws@381 | 375 * the area if @c is not found |
jws@381 | 376 */ |
jws@381 | 377 void * memscan(void * addr, int c, size_t size) |
jws@381 | 378 { |
jws@381 | 379 unsigned char * p = (unsigned char *) addr; |
jws@381 | 380 |
jws@381 | 381 while (size) { |
jws@381 | 382 if (*p == c) |
jws@381 | 383 return (void *) p; |
jws@381 | 384 p++; |
jws@381 | 385 size--; |
jws@381 | 386 } |
jws@381 | 387 return (void *) p; |
jws@381 | 388 } |
jws@381 | 389 #endif |
jws@381 | 390 |
jws@381 | 391 #ifndef __HAVE_ARCH_STRSTR |
jws@381 | 392 /** |
jws@381 | 393 * strstr - Find the first substring in a %NUL terminated string |
jws@381 | 394 * @s1: The string to be searched |
jws@381 | 395 * @s2: The string to search for |
jws@381 | 396 */ |
jws@381 | 397 char * strstr(const char * s1,const char * s2) |
jws@381 | 398 { |
jws@381 | 399 int l1, l2; |
jws@381 | 400 |
jws@381 | 401 l2 = strlen(s2); |
jws@381 | 402 if (!l2) |
jws@381 | 403 return (char *) s1; |
jws@381 | 404 l1 = strlen(s1); |
jws@381 | 405 while (l1 >= l2) { |
jws@381 | 406 l1--; |
jws@381 | 407 if (!memcmp(s1,s2,l2)) |
jws@381 | 408 return (char *) s1; |
jws@381 | 409 s1++; |
jws@381 | 410 } |
jws@381 | 411 return NULL; |
jws@381 | 412 } |
jws@381 | 413 #endif |
jws@381 | 414 |
jws@381 | 415 #ifndef __HAVE_ARCH_MEMCHR |
jws@381 | 416 /** |
jws@381 | 417 * memchr - Find a character in an area of memory. |
jws@381 | 418 * @s: The memory area |
jws@381 | 419 * @c: The byte to search for |
jws@381 | 420 * @n: The size of the area. |
jws@381 | 421 * |
jws@381 | 422 * returns the address of the first occurrence of @c, or %NULL |
jws@381 | 423 * if @c is not found |
jws@381 | 424 */ |
jws@381 | 425 void *memchr(const void *s, int c, size_t n) |
jws@381 | 426 { |
jws@381 | 427 const unsigned char *p = s; |
jws@381 | 428 while (n-- != 0) { |
jws@381 | 429 if ((unsigned char)c == *p++) { |
jws@381 | 430 return (void *)(p-1); |
jws@381 | 431 } |
jws@381 | 432 } |
jws@381 | 433 return NULL; |
jws@381 | 434 } |
jws@381 | 435 |
jws@381 | 436 #endif |
kaf24@3952 | 437 |
kaf24@3952 | 438 /* |
kaf24@3952 | 439 * Local variables: |
kaf24@3952 | 440 * mode: C |
kaf24@3952 | 441 * c-set-style: "BSD" |
kaf24@3952 | 442 * c-basic-offset: 8 |
kaf24@3952 | 443 * tab-width: 8 |
kaf24@3952 | 444 * indent-tabs-mode: t |
kaf24@4026 | 445 * End: |
kaf24@3952 | 446 */ |