Package: libkeyutils1 Version: 1.2-7 Severity: minor Tags: patch
typical c errors, e.g leak on failed realloc. patches attached and both inlined for easy review. diff --git a/keyutils.c b/keyutils.c index 891fee4..d6e7688 100644 --- a/keyutils.c +++ b/keyutils.c @@ -165,6 +165,24 @@ long keyctl_assume_authority(key_serial_t id) return keyctl(KEYCTL_ASSUME_AUTHORITY, id); } + +/*****************************************************************************/ +/* + * plain realloc is just crazy + */ +static void* __xrealloc(void* ptr, size_t size) +{ + void* ret; + + ret = realloc(ptr, size); + if(!ret) { + free(ptr); + return 0; + } + return ret; +} + + /*****************************************************************************/ /* * fetch key description into an allocated buffer @@ -187,14 +205,16 @@ int keyctl_describe_alloc(key_serial_t id, char **_buffer) for (;;) { ret = keyctl_describe(id, buf, buflen); - if (ret < 0) + if (ret < 0) { + free(buf); return -1; + } if (buflen >= ret) break; buflen = ret; - buf = realloc(buf, buflen); + buf = __xrealloc(buf, buflen); if (!buf) return -1; } @@ -226,14 +246,16 @@ int keyctl_read_alloc(key_serial_t id, void **_buffer) for (;;) { ret = keyctl_read(id, buf, buflen); - if (ret < 0) + if (ret < 0) { + free(buf); return -1; + } if (buflen >= ret) break; buflen = ret; - buf = realloc(buf, buflen + 1); + buf = __xrealloc(buf, buflen + 1); if (!buf) return -1; } cu, michael -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (991, 'unstable'), (500, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.23-grml64 (SMP w/2 CPU cores; PREEMPT) Locale: LANG=en_US.iso885915, LC_CTYPE=en_US.iso885915 (charmap=ISO-8859-15) Shell: /bin/sh linked to /bin/bash Versions of packages libkeyutils1 depends on: ii libc6 2.7-3 GNU C Library: Shared libraries libkeyutils1 recommends no packages. libkeyutils1 suggests no packages. -- no debconf information
>From 7160effbc6c3d14387593e5a8a0e0de2973bcf72 Mon Sep 17 00:00:00 2001 From: Michael Gebetsroither <[EMAIL PROTECTED]> Date: Mon, 25 Aug 2008 02:04:38 +0200 Subject: [PATCH 1/2] fixed memleak from realloc Signed-off-by: Michael Gebetsroither <[EMAIL PROTECTED]> diff --git a/keyutils.c b/keyutils.c index 891fee4..f743def 100644 --- a/keyutils.c +++ b/keyutils.c @@ -165,6 +165,24 @@ long keyctl_assume_authority(key_serial_t id) return keyctl(KEYCTL_ASSUME_AUTHORITY, id); } + +/*****************************************************************************/ +/* + * plain realloc is just crazy + */ +static void* __xrealloc(void* ptr, size_t size) +{ + void* ret; + + ret = realloc(ptr, size); + if(!ret) { + free(ptr); + return 0; + } + return ret; +} + + /*****************************************************************************/ /* * fetch key description into an allocated buffer @@ -194,7 +212,7 @@ int keyctl_describe_alloc(key_serial_t id, char **_buffer) break; buflen = ret; - buf = realloc(buf, buflen); + buf = __xrealloc(buf, buflen); if (!buf) return -1; } @@ -233,7 +251,7 @@ int keyctl_read_alloc(key_serial_t id, void **_buffer) break; buflen = ret; - buf = realloc(buf, buflen + 1); + buf = __xrealloc(buf, buflen + 1); if (!buf) return -1; } -- 1.5.6.3
>From b8018a671bc2334840e759efff7a73f3e9fef305 Mon Sep 17 00:00:00 2001 From: Michael Gebetsroither <[EMAIL PROTECTED]> Date: Mon, 25 Aug 2008 02:05:39 +0200 Subject: [PATCH 2/2] fixed another memleak Signed-off-by: Michael Gebetsroither <[EMAIL PROTECTED]> diff --git a/keyutils.c b/keyutils.c index f743def..d6e7688 100644 --- a/keyutils.c +++ b/keyutils.c @@ -205,8 +205,10 @@ int keyctl_describe_alloc(key_serial_t id, char **_buffer) for (;;) { ret = keyctl_describe(id, buf, buflen); - if (ret < 0) + if (ret < 0) { + free(buf); return -1; + } if (buflen >= ret) break; @@ -244,8 +246,10 @@ int keyctl_read_alloc(key_serial_t id, void **_buffer) for (;;) { ret = keyctl_read(id, buf, buflen); - if (ret < 0) + if (ret < 0) { + free(buf); return -1; + } if (buflen >= ret) break; -- 1.5.6.3