comparison lib-src/pop.c @ 87700:2e70121a6595

(pop_stat, pop_last): Check validity of string-to-integer conversion. Mistakes spotted by Nico Golde.
author Chong Yidong <cyd@stupidchicken.com>
date Thu, 10 Jan 2008 15:33:52 +0000
parents 107ccd98fa12
children b394429bd805
comparison
equal deleted inserted replaced
87699:9b166b697889 87700:2e70121a6595
350 popserver server; 350 popserver server;
351 int *count; 351 int *count;
352 int *size; 352 int *size;
353 { 353 {
354 char *fromserver; 354 char *fromserver;
355 char *end_ptr;
355 356
356 if (server->in_multi) 357 if (server->in_multi)
357 { 358 {
358 strcpy (pop_error, "In multi-line query in pop_stat"); 359 strcpy (pop_error, "In multi-line query in pop_stat");
359 return (-1); 360 return (-1);
375 pop_trash (server); 376 pop_trash (server);
376 } 377 }
377 return (-1); 378 return (-1);
378 } 379 }
379 380
380 *count = atoi (&fromserver[4]); 381 errno = 0;
382 *count = strtol (&fromserver[4], &end_ptr, 10);
383 /* Check validity of string-to-integer conversion. */
384 if (fromserver[4] == 0 || *end_ptr != 0 || errno)
385 {
386 strcpy (pop_error, "Unexpected response from POP server in pop_stat");
387 pop_trash (server);
388 return (-1);
389 }
381 390
382 fromserver = index (&fromserver[4], ' '); 391 fromserver = index (&fromserver[4], ' ');
383 if (! fromserver) 392 if (! fromserver)
384 { 393 {
385 strcpy (pop_error, 394 strcpy (pop_error,
386 "Badly formatted response from server in pop_stat"); 395 "Badly formatted response from server in pop_stat");
387 pop_trash (server); 396 pop_trash (server);
388 return (-1); 397 return (-1);
389 } 398 }
390 399
391 *size = atoi (fromserver + 1); 400 errno = 0;
401 *size = strtol (fromserver + 1, &end_ptr, 10);
402 if (*(fromserver + 1) == 0 || *end_ptr != 0 || errno)
403 {
404 strcpy (pop_error, "Unexpected response from POP server in pop_stat");
405 pop_trash (server);
406 return (-1);
407 }
392 408
393 return (0); 409 return (0);
394 } 410 }
395 411
396 /* 412 /*
911 pop_trash (server); 927 pop_trash (server);
912 return (-1); 928 return (-1);
913 } 929 }
914 else 930 else
915 { 931 {
916 return (atoi (&fromserver[4])); 932 char *end_ptr;
933 int count;
934 errno = 0;
935 count = strtol (&fromserver[4], &end_ptr, 10);
936 if (fromserver[4] == 0 || *end_ptr != 0 || errno)
937 {
938 strcpy (pop_error, "Unexpected response from server in pop_last");
939 pop_trash (server);
940 return (-1);
941 }
942 return count;
917 } 943 }
918 } 944 }
919 945
920 /* 946 /*
921 * Function: pop_reset 947 * Function: pop_reset