[Bug stdio/33730] New: sscanf crashes

tydeman.fred at gmail dot com sourceware-bugzilla@sourceware.org
Sat Dec 20 02:51:01 GMT 2025


https://sourceware.org/bugzilla/show_bug.cgi?id=33730

            Bug ID: 33730
           Summary: sscanf crashes
           Product: glibc
           Version: 2.41
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: stdio
          Assignee: unassigned at sourceware dot org
          Reporter: tydeman.fred at gmail dot com
  Target Milestone: ---

This program:
#include <assert.h>
#include <limits.h>
#include <errno.h>
#include <stdio.h>
#include <float.h>
#include <fenv.h>
#include <complex.h>
#include <math.h>

#pragma STDC FENV_ACCESS ON
#pragma STDC FP_CONTRACT OFF
#pragma STDC FENV_ROUND FE_TONEAREST
#pragma STDC FENV_DEC_ROUND FE_DEC_TONEAREST
#pragma STDC CX_LIMITED_RANGE OFF

int main(void){

  if(1){
    double d35 = -1.;
    int i35 = -1;
    int count = -1;
    char string[8] = "1234567";
    i35 = sscanf("junk()", "%le%n%8s", &d35, &count, string );
    (void)printf("Results for known junk\n");
    (void)printf("i35=%i\n", i35);
    (void)printf("d35=%g\n", d35);
    (void)printf("count=%i\n", count);
    (void)printf("string='%s'\n", string);

    // gcc.x86_64 15.2.1-5.fc42 updates 
    // libc.x86_64 2.41-11.fc42 updates => crash on next sscanf
    (void)printf("\nBad results for bad hex floating point\n");
    i35 = sscanf("100ergs", "%le%n%8s", &d35, &count, string );
    (void)printf("i35=%i\n", i35);
    (void)printf("d35=%g\n", d35);
    (void)printf("count=%i\n", count);
    (void)printf("string='%s'\n", string);
  }
  return 0;
}

With these commmand line options:

# flags common to both compiler and linker
export CLFLAGS="\
 -fsanitize=undefined \
 -fsanitize=address \
 -fsanitize=bounds-strict \
 -fstack-protector-all"
# flags for compiler
export CFLAGS="-H -std=c23 -O0 -march=native -mhard-float -mfpmath=387
-mieee-fp \
 -enable-decimal-float=yes \
 -fexcess-precision=standard \
 -ffp-contract=off \
 -fmath-errno \
 -fno-associative-math \
 -fno-builtin \
 -fno-cx-limited-range \
 -fno-fast-math \
 -fno-finite-math-only \
 -fno-reciprocal-math \
 -fno-unsafe-math-optimizations \
 -frounding-math \
 -fsignaling-nans \
 -fsigned-zeros \
 -ftrapping-math \
 ${INCS} \
 -I/usr/include/dfp"

On Intel x86_64 with Fedora Linux 42

gets this output:

=================================================================
==2232==ERROR: AddressSanitizer: stack-buffer-overflow on address
0x7beaa6000068 at pc 0x7feaa946fabc bp 0x7fff57078be0 sp 0x7fff570783a0
WRITE of size 9 at 0x7beaa6000068 thread T0
    #0 0x7feaa946fabb in scanf_common(void*, int, bool, char const*,
__va_list_tag*) (/lib64/libasan.so.8+0x6fabb) (BuildId:
4386f3fdd17c14d95efd91d6e6589d3e48629889)
    #1 0x7feaa94b01d8 in __isoc23_vsscanf (/lib64/libasan.so.8+0xb01d8)
(BuildId: 4386f3fdd17c14d95efd91d6e6589d3e48629889)
    #2 0x7feaa94b099c in __isoc23_sscanf (/lib64/libasan.so.8+0xb099c)
(BuildId: 4386f3fdd17c14d95efd91d6e6589d3e48629889)
    #3 0x00000040076f in main
(/lindata/fpcets/gcc64/1521/c87/test188.exe+0x40076f) (BuildId:
ba11d9a55566bd9b1a737e9564621feebed9d7d3)
    #4 0x7feaa8611574 in __libc_start_call_main (/lib64/libc.so.6+0x3574)
(BuildId: 48c4b9b1efb1df15da8e787f489128bf31893317)
    #5 0x7feaa8611627 in __libc_start_main@GLIBC_2.2.5
(/lib64/libc.so.6+0x3627) (BuildId: 48c4b9b1efb1df15da8e787f489128bf31893317)
    #6 0x000000400454 in _start
(/lindata/fpcets/gcc64/1521/c87/test188.exe+0x400454) (BuildId:
ba11d9a55566bd9b1a737e9564621feebed9d7d3)

Address 0x7beaa6000068 is located in stack of thread T0 at offset 104 in frame
    #0 0x000000400525 in main
(/lindata/fpcets/gcc64/1521/c87/test188.exe+0x400525) (BuildId:
ba11d9a55566bd9b1a737e9564621feebed9d7d3)

  This frame has 3 object(s):
    [48, 52) 'count' (line 21)
    [64, 72) 'd35' (line 19)
    [96, 104) 'string' (line 22) <== Memory access at offset 104 overflows this
variable
HINT: this may be a false positive if your program uses some custom stack
unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow
(/lindata/fpcets/gcc64/1521/c87/test188.exe+0x40076f) (BuildId:
ba11d9a55566bd9b1a737e9564621feebed9d7d3) in main
Shadow bytes around the buggy address:
  0x7beaa5fffd80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa5fffe00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa5fffe80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa5ffff00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa5ffff80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x7beaa6000000: f1 f1 f1 f1 f1 f1 04 f2 00 f2 f2 f2 00[f3]f3 f3
  0x7beaa6000080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa6000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa6000180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa6000200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x7beaa6000280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==2232==ABORTING

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the Glibc-bugs mailing list