Apply by doing:
cd /usr/src
patch -p0 < 023_lprm.patch
And then rebuild and install lprm:
cd usr.sbin/lpr
make obj
make depend && make && make install
Index: usr.sbin/lpr/common_source/rmjob.c
===================================================================
RCS file: /cvs/src/usr.sbin/lpr/common_source/rmjob.c,v
retrieving revision 1.12
diff -u -r1.12 rmjob.c
--- usr.sbin/lpr/common_source/rmjob.c 16 Feb 2002 21:28:03 -0000 1.12
+++ usr.sbin/lpr/common_source/rmjob.c 5 Mar 2003 00:54:55 -0000
@@ -322,6 +322,7 @@
{
char *cp;
int i, rem;
+ size_t n;
char buf[BUFSIZ];
if (!remote)
@@ -333,18 +334,26 @@
*/
fflush(stdout);
- (void)snprintf(buf, sizeof(buf)-2, "\5%s %s", RP, all ? "-all" : person);
- cp = buf + strlen(buf);
- for (i = 0; i < users && cp-buf+1+strlen(user[i]) < sizeof buf - 2; i++) {
- cp += strlen(cp);
+ /* the trailing space will be replaced with a newline later */
+ n = snprintf(buf, sizeof(buf), "\5%s %s ", RP, all ? "-all" : person);
+ if (n == -1 || n >= sizeof(buf))
+ goto bad;
+ cp = buf + n;
+ for (i = 0; i < users; i++) {
+ n = strlcpy(cp, user[i], sizeof(buf) - (cp - buf + 1));
+ if (n >= sizeof(buf) - (cp - buf + 1))
+ goto bad;
+ cp += n;
*cp++ = ' ';
- strcpy(cp, user[i]);
}
- for (i = 0; i < requests && cp-buf+10 < sizeof(buf) - 2; i++) {
- cp += strlen(cp);
- (void) sprintf(cp, " %d", requ[i]);
+ *cp = '\0';
+ for (i = 0; i < requests; i++) {
+ n = snprintf(cp, sizeof(buf) - (cp - buf), "%d ", requ[i]);
+ if (n == -1 || n >= sizeof(buf) - (cp - buf))
+ goto bad;
+ cp += n;
}
- strcat(cp, "\n");
+ cp[-1] = '\n'; /* replace space with newline, leave the NUL */
rem = getport(RM, 0);
if (rem < 0) {
if (from != host)
@@ -358,6 +367,10 @@
(void) fwrite(buf, 1, i, stdout);
(void) close(rem);
}
+ return;
+bad:
+ printf("remote buffer too large\n");
+ return;
}
/*