Bug 3031 - scanf handles %p as an integer, truncated value on 64bits platforms
Summary: scanf handles %p as an integer, truncated value on 64bits platforms
Status: RESOLVED DUPLICATE of bug 3037
Alias: None
Product: uClibc
Classification: Unclassified
Component: stdio (show other bugs)
Version: 0.9.32
Hardware: PC Linux
: P5 normal
Target Milestone: ---
Assignee: unassigned
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-12-31 10:36 UTC by Eric Hassold
Modified: 2010-12-31 10:42 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Eric Hassold 2010-12-31 10:36:57 UTC
When scanning %p conversion, sscanf stores value as an unsigned integer. On 64bits platforms (e.g. x86_64), this causes returned pointers to be invalid since high-word is lost. Test to reproduce:

     #include <stdio.h>
     #define PREFIX "ZZZZZ"
     
     int main (int qrgc, char **argv) {
       void *p = (void*) 0x1122334455667788;
       char *s = PREFIX "0xABCD00004321";
       sscanf(s,PREFIX"%p",&p);
       printf("scanned '%s', got %p\n",s,p);
       return 0;
     }

This was observed with latest snapshot from master branch, but since code in _sscanf.c hasn't been modified since 2009, bug should exist in several prior releases (while affecting only 64bits platforms).

To work around this, I modified QUAL_CHARS so %p conversion uses PDS value (like %t modifier) when calling store_inttype(). Patch attached.
Comment 1 Eric Hassold 2010-12-31 10:42:12 UTC

*** This bug has been marked as a duplicate of bug 3037 ***