Module Name: src
Committed By: mrg
Date: Thu Aug 10 20:36:29 UTC 2023
Modified Files:
src/external/bsd/pdisk/dist: io.c
src/usr.bin/find: misc.c
src/usr.bin/mail: extern.h fio.c thread.c thread.h
src/usr.bin/rs: rs.c
src/usr.bin/sort: files.c
Log Message:
avoid various use-after-free issues.
create a ptrdiff_t offset between the start of an allocation region and
some interesting pointer, so it can be adjusted with this offset after
realloc() returns. for pdisk(), realloc() is a locally inlind malloc()
and free() pair.
for mail(1), this required a little bit more effort as the old pointer
was passed into another file for fix-ups there, and that code needed to
be adjusted for offset vs old pointer usage.
found by GCC 12.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/pdisk/dist/io.c
cvs rdiff -u -r1.15 -r1.16 src/usr.bin/find/misc.c
cvs rdiff -u -r1.35 -r1.36 src/usr.bin/mail/extern.h
cvs rdiff -u -r1.43 -r1.44 src/usr.bin/mail/fio.c
cvs rdiff -u -r1.14 -r1.15 src/usr.bin/mail/thread.c
cvs rdiff -u -r1.2 -r1.3 src/usr.bin/mail/thread.h
cvs rdiff -u -r1.16 -r1.17 src/usr.bin/rs/rs.c
cvs rdiff -u -r1.42 -r1.43 src/usr.bin/sort/files.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/pdisk/dist/io.c
diff -u src/external/bsd/pdisk/dist/io.c:1.2 src/external/bsd/pdisk/dist/io.c:1.3
--- src/external/bsd/pdisk/dist/io.c:1.2 Sat Mar 23 15:39:43 2013
+++ src/external/bsd/pdisk/dist/io.c Thu Aug 10 20:36:28 2023
@@ -328,6 +328,7 @@ get_string(int eos)
char *ret_value;
char *limit;
int length;
+ ptrdiff_t off;
ret_value = (char *) malloc(STRING_CHUNK);
if (ret_value == NULL) {
@@ -348,8 +349,9 @@ get_string(int eos)
break;
}
strncpy(limit, ret_value, length);
+ off = s - ret_value;
free(ret_value);
- s = limit + (s - ret_value);
+ s = limit + off;
ret_value = limit;
length += STRING_CHUNK;
limit = ret_value + length;
Index: src/usr.bin/find/misc.c
diff -u src/usr.bin/find/misc.c:1.15 src/usr.bin/find/misc.c:1.16
--- src/usr.bin/find/misc.c:1.15 Sat Jan 22 14:08:19 2022
+++ src/usr.bin/find/misc.c Thu Aug 10 20:36:28 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: misc.c,v 1.15 2022/01/22 14:08:19 christos Exp $ */
+/* $NetBSD: misc.c,v 1.16 2023/08/10 20:36:28 mrg Exp $ */
/*-
* Copyright (c) 1990, 1993, 1994
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "from: @(#)misc.c 8.2 (Berkeley) 4/1/94";
#else
-__RCSID("$NetBSD: misc.c,v 1.15 2022/01/22 14:08:19 christos Exp $");
+__RCSID("$NetBSD: misc.c,v 1.16 2023/08/10 20:36:28 mrg Exp $");
#endif
#endif /* not lint */
@@ -78,11 +78,13 @@ brace_subst(char *orig, char **store, ch
nlen *= 2;
if (nlen > *len) {
+ ptrdiff_t off = p - *store;
+
ostore = *store;
if ((*store = realloc(ostore, nlen)) == NULL)
err(1, "realloc");
*len = nlen;
- p += *store - ostore; /* Relocate. */
+ p = *store + off; /* Relocate. */
}
memmove(p, path, plen);
p += plen;
Index: src/usr.bin/mail/extern.h
diff -u src/usr.bin/mail/extern.h:1.35 src/usr.bin/mail/extern.h:1.36
--- src/usr.bin/mail/extern.h:1.35 Tue Aug 1 07:04:17 2023
+++ src/usr.bin/mail/extern.h Thu Aug 10 20:36:28 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: extern.h,v 1.35 2023/08/01 07:04:17 mrg Exp $ */
+/* $NetBSD: extern.h,v 1.36 2023/08/10 20:36:28 mrg Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -29,7 +29,7 @@
* SUCH DAMAGE.
*
* @(#)extern.h 8.2 (Berkeley) 4/20/95
- * $NetBSD: extern.h,v 1.35 2023/08/01 07:04:17 mrg Exp $
+ * $NetBSD: extern.h,v 1.36 2023/08/10 20:36:28 mrg Exp $
*/
#ifndef __EXTERN_H__
@@ -357,7 +357,7 @@ int get_msgCount(void);
/* we trash these commands */
# define do_recursion() 0
# define thread_recursion(mp,fn,args) fn(mp,args)
-# define thread_fix_old_links(nmessage,message,omsgCount)
+# define thread_fix_old_links(nmessage,off,omsgCount)
# define thread_fix_new_links(message,omsgCount,msgCount)
#endif /* THREAD_SUPPORT */
Index: src/usr.bin/mail/fio.c
diff -u src/usr.bin/mail/fio.c:1.43 src/usr.bin/mail/fio.c:1.44
--- src/usr.bin/mail/fio.c:1.43 Thu Nov 9 20:27:50 2017
+++ src/usr.bin/mail/fio.c Thu Aug 10 20:36:28 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: fio.c,v 1.43 2017/11/09 20:27:50 christos Exp $ */
+/* $NetBSD: fio.c,v 1.44 2023/08/10 20:36:28 mrg Exp $ */
/*
* Copyright (c) 1980, 1993
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)fio.c 8.2 (Berkeley) 4/20/95";
#else
-__RCSID("$NetBSD: fio.c,v 1.43 2017/11/09 20:27:50 christos Exp $");
+__RCSID("$NetBSD: fio.c,v 1.44 2023/08/10 20:36:28 mrg Exp $");
#endif
#endif /* not lint */
@@ -125,20 +125,23 @@ makemessage(FILE *f, int omsgCount, int
size_t size;
struct message *omessage; /* old message structure array */
struct message *nmessage;
+ ptrdiff_t off;
omessage = get_abs_message(1);
size = (nmsgCount + 1) * sizeof(*nmessage);
+
+ if (omsgCount == 0 || omessage == NULL)
+ off = 0;
+ else
+ off = dot - omessage;
nmessage = realloc(omessage, size);
if (nmessage == NULL)
err(EXIT_FAILURE,
"Insufficient memory for %d messages", nmsgCount);
- if (omsgCount == 0 || omessage == NULL)
- dot = nmessage;
- else
- dot = nmessage + (dot - omessage);
+ dot = nmessage + off;
- thread_fix_old_links(nmessage, omessage, omsgCount);
+ thread_fix_old_links(nmessage, off, omsgCount);
#ifndef THREAD_SUPPORT
message = nmessage;
Index: src/usr.bin/mail/thread.c
diff -u src/usr.bin/mail/thread.c:1.14 src/usr.bin/mail/thread.c:1.15
--- src/usr.bin/mail/thread.c:1.14 Fri Dec 17 15:29:44 2021
+++ src/usr.bin/mail/thread.c Thu Aug 10 20:36:28 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: thread.c,v 1.14 2021/12/17 15:29:44 kre Exp $ */
+/* $NetBSD: thread.c,v 1.15 2023/08/10 20:36:28 mrg Exp $ */
/*-
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#ifndef __lint__
-__RCSID("$NetBSD: thread.c,v 1.14 2021/12/17 15:29:44 kre Exp $");
+__RCSID("$NetBSD: thread.c,v 1.15 2023/08/10 20:36:28 mrg Exp $");
#endif /* not __lint__ */
#include <assert.h>
@@ -440,10 +440,10 @@ redepth(struct thread_s *thread)
* as it needs access to current_thread.t_head.
*/
PUBLIC void
-thread_fix_old_links(struct message *nmessage, struct message *message, int omsgCount)
+thread_fix_old_links(struct message *nmessage, ptrdiff_t off, int omsgCount)
{
int i;
- if (nmessage == message)
+ if (off == 0)
return;
#ifndef NDEBUG
@@ -451,8 +451,7 @@ thread_fix_old_links(struct message *nme
#endif
# define FIX_LINK(p) do {\
- if (p)\
- p = nmessage + (p - message);\
+ p = nmessage + off;\
} while (0)
FIX_LINK(current_thread.t_head);
Index: src/usr.bin/mail/thread.h
diff -u src/usr.bin/mail/thread.h:1.2 src/usr.bin/mail/thread.h:1.3
--- src/usr.bin/mail/thread.h:1.2 Mon Apr 28 20:24:14 2008
+++ src/usr.bin/mail/thread.h Thu Aug 10 20:36:28 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: thread.h,v 1.2 2008/04/28 20:24:14 martin Exp $ */
+/* $NetBSD: thread.h,v 1.3 2023/08/10 20:36:28 mrg Exp $ */
/*-
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -56,7 +56,7 @@ int get_abs_msgCount(void);
/*
* Support hooks used by other modules.
*/
-void thread_fix_old_links(struct message *, struct message *, int);
+void thread_fix_old_links(struct message *, ptrdiff_t, int);
void thread_fix_new_links(struct message *, int, int);
int thread_hidden(void);
int thread_depth(void);
Index: src/usr.bin/rs/rs.c
diff -u src/usr.bin/rs/rs.c:1.16 src/usr.bin/rs/rs.c:1.17
--- src/usr.bin/rs/rs.c:1.16 Sun Feb 3 03:19:30 2019
+++ src/usr.bin/rs/rs.c Thu Aug 10 20:36:29 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: rs.c,v 1.16 2019/02/03 03:19:30 mrg Exp $ */
+/* $NetBSD: rs.c,v 1.17 2023/08/10 20:36:29 mrg Exp $ */
/*-
* Copyright (c) 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1993\
#if 0
static char sccsid[] = "@(#)rs.c 8.1 (Berkeley) 6/6/93";
#else
-__RCSID("$NetBSD: rs.c,v 1.16 2019/02/03 03:19:30 mrg Exp $");
+__RCSID("$NetBSD: rs.c,v 1.17 2023/08/10 20:36:29 mrg Exp $");
#endif
#endif /* not lint */
@@ -376,13 +376,15 @@ static char **
getptrs(char **sp)
{
char **p;
+ ptrdiff_t off;
allocsize += allocsize;
+ off = sp - elem;
p = (char **)realloc(elem, allocsize * sizeof(char *));
if (p == (char **)0)
err(1, "no memory");
- sp += (p - elem);
+ sp = p + off;
endelem = (elem = p) + allocsize;
return(sp);
}
Index: src/usr.bin/sort/files.c
diff -u src/usr.bin/sort/files.c:1.42 src/usr.bin/sort/files.c:1.43
--- src/usr.bin/sort/files.c:1.42 Wed Aug 5 07:10:03 2015
+++ src/usr.bin/sort/files.c Thu Aug 10 20:36:29 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: files.c,v 1.42 2015/08/05 07:10:03 mrg Exp $ */
+/* $NetBSD: files.c,v 1.43 2023/08/10 20:36:29 mrg Exp $ */
/*-
* Copyright (c) 2000-2003 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
#include "sort.h"
#include "fsort.h"
-__RCSID("$NetBSD: files.c,v 1.42 2015/08/05 07:10:03 mrg Exp $");
+__RCSID("$NetBSD: files.c,v 1.43 2023/08/10 20:36:29 mrg Exp $");
#include <string.h>
@@ -199,13 +199,14 @@ seq(FILE *fp, u_char **line)
/* Long line - double size of buffer */
/* XXX: Check here for stupidly long lines */
buf_size *= 2;
+ ptrdiff_t off = pos - buf;
new_buf = realloc(buf, buf_size);
if (!new_buf)
err(2, "realloc of linebuf to %zu bytes failed",
buf_size);
end = new_buf + buf_size;
- pos = new_buf + (pos - buf);
+ pos = new_buf + off;
buf = new_buf;
}
}