Unitialised pointer free in is_crontab_available

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Here's the code:

static int is_crontab_available(void)
{
char *cmd;
int is_available;
int ret;

if (get_schedule_cmd("crontab", &is_available, &cmd)) {
ret = is_available;
goto out;
}

#ifdef __APPLE__
/*
* macOS has cron, but it requires special permissions and will
* create a UI alert when attempting to run this command.
*/
ret = 0;
#else
ret = check_crontab_process(cmd);
#endif

out:
free(cmd);
return ret;
}


This code will try to `free(cmd)` even if get_schedule_cmd returned 0,
when it's safe to assume that &cmd was not allocated.


static int get_schedule_cmd(const char *cmd, int *is_available, char **out)
{
char *testing = xstrdup_or_null(getenv("GIT_TEST_MAINT_SCHEDULER"));
struct string_list_item *item;
struct string_list list = STRING_LIST_INIT_NODUP;

if (!testing)
return 0;

[rest snipped]


If I read this right, as long as the special env var is not set, this
function returns 0 and does not populate *out.


Reproduce:
run `git maintenance start` on a mac in some git repo

Tested with:
macos Darwin 24.0.0
arm64
homebrew git 2.47.0



c/cpython (main)> lldb (which git)
(lldb) target create "/opt/homebrew/bin/git"
Current executable set to '/opt/homebrew/bin/git' (arm64).
(lldb) b malloc_error_break
Breakpoint 1: where = libsystem_malloc.dylib`malloc_error_break,
address = 0x00000001802861bc
(lldb) run maintenance start
Process 35052 launched: '/opt/homebrew/bin/git' (arm64)
git(35052,0x1ec22b240) malloc: *** error for object 0x1: pointer being
freed was not allocated
git(35052,0x1ec22b240) malloc: *** set a breakpoint in
malloc_error_break to debug
Process 35052 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x00000001879221bc libsystem_malloc.dylib`malloc_error_break
libsystem_malloc.dylib`malloc_error_break:
->  0x1879221bc <+0>:  pacibsp
    0x1879221c0 <+4>:  stp    x29, x30, [sp, #-0x10]!
    0x1879221c4 <+8>:  mov    x29, sp
    0x1879221c8 <+12>: nop
Target 0: (git) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
  * frame #0: 0x00000001879221bc libsystem_malloc.dylib`malloc_error_break
    frame #1: 0x00000001879015e8 libsystem_malloc.dylib`malloc_vreport + 748
    frame #2: 0x000000018790523c libsystem_malloc.dylib`malloc_report + 64
    frame #3: 0x000000018792326c libsystem_malloc.dylib`find_zone_and_free + 528
    frame #4: 0x000000010004fa78 git`is_crontab_available + 56
    frame #5: 0x000000010004f974 git`update_background_schedule + 168
    frame #6: 0x000000010004e1dc git`maintenance_start + 248
    frame #7: 0x000000010004d9b4 git`cmd_maintenance + 336
    frame #8: 0x0000000100005678 git`run_builtin + 396
    frame #9: 0x0000000100004b48 git`handle_builtin + 324
    frame #10: 0x00000001000043c0 git`cmd_main + 788
    frame #11: 0x00000001000c141c git`main + 236
    frame #12: 0x0000000187768274 dyld`start + 2840
(lldb) frame select 4
frame #4: 0x000000010004fa78 git`is_crontab_available + 56
git`is_crontab_available:
->  0x10004fa78 <+56>: mov    x0, x19
    0x10004fa7c <+60>: ldp    x29, x30, [sp, #0x20]
    0x10004fa80 <+64>: ldp    x20, x19, [sp, #0x10]
    0x10004fa84 <+68>: add    sp, sp, #0x30
(lldb) disassemble -n is_crontab_available
git`is_crontab_available:
    0x10004fa40 <+0>:  sub    sp, sp, #0x30
    0x10004fa44 <+4>:  stp    x20, x19, [sp, #0x10]
    0x10004fa48 <+8>:  stp    x29, x30, [sp, #0x20]
    0x10004fa4c <+12>: add    x29, sp, #0x20
    0x10004fa50 <+16>: adrp   x0, 535
    0x10004fa54 <+20>: add    x0, x0, #0x3f ; "crontab"
    0x10004fa58 <+24>: add    x1, sp, #0x4
    0x10004fa5c <+28>: add    x2, sp, #0x8
    0x10004fa60 <+32>: bl     0x100050300    ; get_schedule_cmd
    0x10004fa64 <+36>: ldr    w8, [sp, #0x4]
    0x10004fa68 <+40>: cmp    w0, #0x0
    0x10004fa6c <+44>: csel   w19, wzr, w8, eq
    0x10004fa70 <+48>: ldr    x0, [sp, #0x8]
    0x10004fa74 <+52>: bl     0x100249170    ; symbol stub for: free
->  0x10004fa78 <+56>: mov    x0, x19
    0x10004fa7c <+60>: ldp    x29, x30, [sp, #0x20]
    0x10004fa80 <+64>: ldp    x20, x19, [sp, #0x10]
    0x10004fa84 <+68>: add    sp, sp, #0x30
    0x10004fa88 <+72>: ret




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux