Loading...
stdio/FreeBSD/xprintf.c Libc-997.90.3 Libc-1669.40.2
--- Libc/Libc-997.90.3/stdio/FreeBSD/xprintf.c
+++ Libc/Libc-1669.40.2/stdio/FreeBSD/xprintf.c
@@ -62,6 +62,7 @@
 #include "xprintf_private.h"
 #include "xprintf_domain.h"
 #include "fvwrite.h"
+#include "libc_hooks_impl.h"
 
 /*
  * Defining XPRINTF_DEBUG allows the __private_extern__ variable __use_xprintf
@@ -242,25 +243,26 @@
 __private_extern__ int
 __printf_render_n(FILE *io __unused, const struct printf_info *pi, const void *const *arg)
 {
-
-	if (pi->is_char)
-		**((signed char **)arg[0]) = (signed char)pi->sofar;
-	else if (pi->is_short)
-		**((short **)arg[0]) = (short)pi->sofar;
-	else if (pi->is_long)
-		**((long **)arg[0]) = pi->sofar;
-	else if (pi->is_long_double)
-		**((long long **)arg[0]) = pi->sofar;
-	else if (pi->is_intmax)
-		**((intmax_t **)arg[0]) = pi->sofar;
-	else if (pi->is_ptrdiff)
-		**((ptrdiff_t **)arg[0]) = pi->sofar;
-	else if (pi->is_quad)
-		**((quad_t **)arg[0]) = pi->sofar;
-	else if (pi->is_size)
-		**((size_t **)arg[0]) = pi->sofar;
-	else
-		**((int **)arg[0]) = pi->sofar;
+	void *ptr = (void*)arg[0];
+	if (pi->is_char) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, signed char, pi->sofar);
+	} else if (pi->is_short) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, short, pi->sofar);
+	} else if (pi->is_long) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, long, pi->sofar);
+	} else if (pi->is_long_double) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, long long, pi->sofar);
+	} else if (pi->is_intmax) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, intmax_t, pi->sofar);
+	} else if (pi->is_ptrdiff) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, ptrdiff_t, pi->sofar);
+	} else if (pi->is_quad) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, quad_t, pi->sofar);
+	} else if (pi->is_size) {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, size_t, pi->sofar);
+	} else {
+		LIBC_HOOKS_WRITE_SIMPLE_TYPE(ptr, int, pi->sofar);
+	}
 
 	return (0);
 }
@@ -817,12 +819,18 @@
 		case PA_POINTER:
 			pc->args[ch].pvoidarg = va_arg (ap, void *);
 			break;
-		case PA_STRING:
-			pc->args[ch].pchararg = va_arg (ap, char *);
-			break;
-		case PA_WSTRING:
-			pc->args[ch].pwchararg = va_arg (ap, wchar_t *);
-			break;
+		case PA_STRING: {
+			char *s = va_arg(ap, char *);
+			libc_hooks_will_read_cstring(s);
+			pc->args[ch].pchararg = s;
+			break;
+		}
+		case PA_WSTRING: {
+			wchar_t *wcs = va_arg(ap, wchar_t *);
+			libc_hooks_will_read_wcstring(wcs);
+			pc->args[ch].pwchararg = wcs;
+			break;
+		}
 		case PA_DOUBLE:
 #ifndef NO_FLOATING_POINT
 			pc->args[ch].doublearg = va_arg (ap, double);
@@ -916,6 +924,9 @@
 	struct _printf_compiled spc;
 	int ret, saverrno;
 
+	libc_hooks_will_read(loc, sizeof(*loc));
+	libc_hooks_will_read_cstring(fmt);
+
 	/*
 	 * All the printf family (including extensible printf variants) funnel
 	 * down to this point.  So we can do common work here, and then fork
@@ -956,7 +967,7 @@
 	bzero(&spc, sizeof(spc));
 	spc.fmt = fmt;
 	DEFAULT_CURRENT_LOCALE(loc);
-	XL_RETAIN(loc);
+	xlocale_retain(loc);
 	spc.loc = loc;
 	/*
 	 * We don't need to lock the printf_comp_t mutex, since the
@@ -966,14 +977,14 @@
 	if (__printf_comp(&spc, domain) < 0) {
 	    saverrno = errno;
 	    pthread_rwlock_unlock(&domain->rwlock);
-	    XL_RELEASE(loc);
+	    xlocale_release(loc);
 	    errno = saverrno;
 	    return EOF;
 	}
 	ret = __printf_exec(&spc, fp, ap);
 	saverrno = errno;
 	pthread_rwlock_unlock(&domain->rwlock);
-	XL_RELEASE(loc);
+	xlocale_release(loc);
 
 #ifdef XPRINTF_PERF
 	printf_info_enqueue(spc.pa);