From owner-p4-projects@FreeBSD.ORG Sat Jun 21 20:36:37 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 437291065677; Sat, 21 Jun 2008 20:36:37 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 040441065670 for ; Sat, 21 Jun 2008 20:36:37 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id EEE038FC17 for ; Sat, 21 Jun 2008 20:36:36 +0000 (UTC) (envelope-from peter-gmail@wemm.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m5LKaaBP096984 for ; Sat, 21 Jun 2008 20:36:36 GMT (envelope-from peter-gmail@wemm.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m5LKaaxw096982 for perforce@freebsd.org; Sat, 21 Jun 2008 20:36:36 GMT (envelope-from peter-gmail@wemm.org) Date: Sat, 21 Jun 2008 20:36:36 GMT Message-Id: <200806212036.m5LKaaxw096982@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter-gmail@wemm.org using -f From: Peter Wemm To: Perforce Change Reviews Cc: Subject: PERFORCE change 143897 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Jun 2008 20:36:37 -0000 http://perforce.freebsd.org/chv.cgi?CH=143897 Change 143897 by peter@peter_overcee on 2008/06/21 20:36:01 IFC @143896 Affected files ... .. //depot/projects/hammer/contrib/binutils/bfd/coff-mips.c#3 branch .. //depot/projects/hammer/contrib/binutils/bfd/cpu-mips.c#3 branch .. //depot/projects/hammer/contrib/binutils/bfd/elf32-mips.c#3 branch .. //depot/projects/hammer/contrib/binutils/bfd/elf64-mips.c#3 branch .. //depot/projects/hammer/contrib/binutils/bfd/mipsbsd.c#3 branch .. //depot/projects/hammer/contrib/binutils/bfd/pe-mips.c#3 branch .. //depot/projects/hammer/contrib/binutils/include/opcode/mips.h#3 branch .. //depot/projects/hammer/contrib/gdtoa/gethex.c#5 integrate .. //depot/projects/hammer/crypto/heimdal/acinclude.m4#3 branch .. //depot/projects/hammer/lib/libarchive/archive.h#13 branch .. //depot/projects/hammer/lib/libarchive/archive_read_support_format_mtree.c#6 integrate .. //depot/projects/hammer/lib/libarchive/archive_write_disk.c#14 integrate .. //depot/projects/hammer/lib/libarchive/test/test_read_format_isorr_bz2.c#4 integrate .. //depot/projects/hammer/lib/libarchive/test/test_read_format_isorr_bz2.iso.bz2.uu#1 branch .. //depot/projects/hammer/sys/amd64/amd64/pmap.c#181 integrate .. //depot/projects/hammer/sys/netinet/libalias/alias.c#9 integrate .. //depot/projects/hammer/tools/regression/lib/libc/stdio/test-scanfloat.c#8 integrate Differences ... ==== //depot/projects/hammer/contrib/gdtoa/gethex.c#5 (text+ko) ==== @@ -113,8 +113,11 @@ e += e1; } *sp = (char*)s; - if (zret) - return havedig ? STRTOG_Zero : STRTOG_NoNumber; + if (zret) { + if (!havedig) + *sp = s0 - 1; + return STRTOG_Zero; + } n = s1 - s0 - 1; for(k = 0; n > 7; n >>= 1) k++; ==== //depot/projects/hammer/lib/libarchive/archive_read_support_format_mtree.c#6 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_mtree.c,v 1.8 2008/06/15 10:43:59 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/archive_read_support_format_mtree.c,v 1.9 2008/06/21 19:06:37 kientzle Exp $"); #ifdef HAVE_SYS_STAT_H #include @@ -1020,7 +1020,7 @@ } /* - * Since parsing octal escapes always makes strings shorter, + * Since parsing backslash sequences always makes strings shorter, * we can always do this conversion in-place. */ static void @@ -1041,13 +1041,57 @@ if (c == '/' && mentry != NULL) mentry->full = 1; if (c == '\\') { - if (src[0] >= '0' && src[0] <= '3' - && src[1] >= '0' && src[1] <= '7' - && src[2] >= '0' && src[2] <= '7') { - c = (src[0] - '0') << 6; - c |= (src[1] - '0') << 3; - c |= (src[2] - '0'); - src += 3; + switch (src[0]) { + case '0': + if (src[1] < '0' || src[1] > '7') { + c = 0; + ++src; + break; + } + /* FALLTHROUGH */ + case '1': + case '2': + case '3': + if (src[1] >= '0' && src[1] <= '7' && + src[2] >= '0' && src[2] <= '7') { + c = (src[0] - '0') << 6; + c |= (src[1] - '0') << 3; + c |= (src[2] - '0'); + src += 3; + } + break; + case 'a': + c = '\a'; + ++src; + break; + case 'b': + c = '\b'; + ++src; + break; + case 'f': + c = '\f'; + ++src; + break; + case 'n': + c = '\n'; + ++src; + break; + case 'r': + c = '\r'; + ++src; + break; + case 's': + c = ' '; + ++src; + break; + case 't': + c = '\t'; + ++src; + break; + case 'v': + c = '\v'; + ++src; + break; } } *dest++ = c; @@ -1190,6 +1234,7 @@ const void *t; const char *s; void *p; + char *u; /* Accumulate line in a line buffer. */ for (;;) { @@ -1222,10 +1267,32 @@ total_size += bytes_read; /* Null terminate. */ mtree->line.s[total_size] = '\0'; - /* If we found '\n', clean up and return. */ - if (p != NULL) { - *start = mtree->line.s; - return (total_size); + /* If we found an unescaped '\n', clean up and return. */ + if (p == NULL) + continue; + for (u = mtree->line.s; *u; ++u) { + if (u[0] == '\n') { + *start = mtree->line.s; + return total_size; + } + if (u[0] == '#') { + if (p == NULL) + break; + *start = mtree->line.s; + return total_size; + } + if (u[0] != '\\') + continue; + if (u[1] == '\\') { + ++u; + continue; + } + if (u[1] == '\n') { + memmove(u, u + 1, + total_size - (u - mtree->line.s) + 1); + --total_size; + continue; + } } } } ==== //depot/projects/hammer/lib/libarchive/archive_write_disk.c#14 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_disk.c,v 1.25 2008/05/26 17:00:23 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_disk.c,v 1.26 2008/06/21 19:05:29 kientzle Exp $"); #ifdef HAVE_SYS_TYPES_H #include @@ -1351,7 +1351,7 @@ if (*src == '\0') { archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Invalid empty pathname"); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } /* Skip leading '/'. */ @@ -1382,7 +1382,7 @@ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Path contains '..'"); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } lastdotdot = 1; } else @@ -1421,7 +1421,7 @@ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC, "Path contains trailing '..'"); - return (ARCHIVE_WARN); + return (ARCHIVE_FAILED); } if (dest == a->name) { /* ==== //depot/projects/hammer/lib/libarchive/test/test_read_format_isorr_bz2.c#4 (text+ko) ==== @@ -23,11 +23,11 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "test.h" -__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_isorr_bz2.c,v 1.3 2008/01/01 22:28:04 kientzle Exp $"); +__FBSDID("$FreeBSD: src/lib/libarchive/test/test_read_format_isorr_bz2.c,v 1.4 2008/06/21 19:11:51 kientzle Exp $"); /* Execute the following to rebuild the data for this program: - tail -n +5 test-read_format-isorr_bz2.c | /bin/sh + tail -n +32 test_read_format_isorr_bz2.c | /bin/sh rm -rf /tmp/iso mkdir /tmp/iso @@ -35,79 +35,37 @@ echo "hello" >/tmp/iso/file ln /tmp/iso/file /tmp/iso/hardlink (cd /tmp/iso; ln -s file symlink) -TZ=utc touch -afhm -t 197001010000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir -TZ=utc touch -afhm -t 196912312359.58 /tmp/iso/symlink -mkhybrid -R -uid 1 -gid 2 /tmp/iso | bzip2 > data.iso.bz2 -cat data.iso.bz2 | ./maketest.pl > data.c +TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir +TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink +mkhybrid -R -uid 1 -gid 2 /tmp/iso | bzip2 > test_read_format_isorr_bz2.iso.bz2 +F=test_read_format_isorr_bz2.iso.bz2 +uuencode $F $F > $F.uu exit 1 */ -static unsigned char archive[] = { -'B','Z','h','9','1','A','Y','&','S','Y','G',11,4,'c',0,0,199,255,221,255, -255,203,252,221,'c',251,248,'?',255,223,224,167,255,222,'&','!',234,'$',0, -'0',1,' ',0,'D',2,129,8,192,3,14,'2','3','$',19,184,'J',' ','F',168,244,201, -149,'6','Q',226,155,'S',212,209,160,'h','4','i',160,26,13,0,244,134,212,0, -218,'O',212,153,1,144,244,128,148,' ',147,13,' ',213,'=','1','\'',169,166, -128,'=','!',233,0,208,0,26,0,0,30,160,'h',0,'4','z',130,180,163,'@',0,0,4, -211,0,0,0,2,'b','`',0,0,0,0,0,8,146,133,'F',154,'y','A',163,'A',161,163,'@', -'z',134,'C','C','F',131,'F','@',0,0,0,0,6,154,26,'Q',24,234,180,'P',172,251, -'=',2,'P','H','&','Y','o',130,28,'"',229,210,247,227,248,200,'?','6',161, -'?',170,'H',172,'"','H','I',16,'2','"','&',148,'G',133,'T','z',224,1,215, -' ',0,191,184,10,160,24,248,180,183,244,156,'K',202,133,208,'U',5,'6','C', -26,144,'H',168,'H','H','(','"',151,'@','m',223,'(','P',169,'e',145,148,'6', -237,235,7,227,204,']','k','{',241,187,227,244,251,':','a','L',138,'#','R', -'"',221,'_',239,')',140,'*','*',172,'Q',16,1,16,207,166,251,233,'Z',169,'4', -'_',195,'a',14,18,231,'}',14,139,137,'e',213,185,'T',194,'D','`',25,'$',187, -208,'%','c',162,'~',181,'@',204,'2',238,'P',161,213,127,'I',169,3,' ','o', -6,161,16,128,'F',214,'S','m',6,244,11,229,'Z','y','.',176,'q',' ',248,167, -204,26,193,'q',211,241,214,133,221,212,'I','`',28,244,'N','N','f','H','9', -'w',245,209,'*',20,26,208,'h','(',194,156,192,'l',';',192,'X','T',151,177, -209,'0',156,16,'=',20,'k',184,144,'z',26,'j',133,194,'9',227,'<','[','^', -17,'w','p',225,220,248,'>',205,'>','[',19,'5',155,17,175,28,28,168,175,'n', -'\'','c','w',27,222,204,'k','n','x','I',23,237,'c',145,11,184,'A','(',1,169, -'0',180,189,134,'\\','Y','x',187,'C',151,'d','k','y','-','L',218,138,'s', -'*','(',12,'h',242,'*',17,'E','L',202,146,138,'l','0',217,160,'9','.','S', -214,198,143,'3','&',237,'=','t','P',168,214,210,'`','p','J',181,'H',138,149, -'1','B',206,22,164,'[','O','A',172,134,224,179,219,166,184,'X',185,'W',154, -219,19,161,'Y',184,220,237,147,'9',191,237,'&','i','_',226,146,205,160,'@', -'b',182,';',3,'!',183,'J','t',161,160,178,173,'S',235,':','2',159,':',245, -'{','U',174,'P',142,'G','(',')',9,168,185,'A','U',231,193,'g',213,'e',12, -'X',223,22,249,')',152,237,'G',150,156,3,201,245,212,'2',218,209,177,196, -235,'_','~',137,24,31,196,232,'B',172,'w',159,24,'n',156,150,225,'1','y', -22,'#',138,193,227,232,169,170,166,179,1,11,182,'i',')',160,180,198,175,128, -249,167,5,194,142,183,'f',134,206,180,'&','E','!','[',31,195,':',192,'s', -232,187,'N',131,'Y',137,243,15,'y',12,'J',163,'-',242,'5',197,151,130,163, -240,220,'T',161,'L',159,141,159,152,'4',18,128,'.','^',250,168,200,163,'P', -231,'Y','w','F','U',186,'x',190,16,'0',228,22,'9','F','t',168,157,'i',190, -'+',246,141,142,18,' ','M',174,197,'O',165,'m',224,27,'b',150,'|','W','H', -196,'.','*','Q','$',225,'I','-',148,169,'F',7,197,'m','-',130,153,0,158,21, -'(',221,221,226,206,'g',13,159,163,'y',176,'~',158,'k','4','q','d','s',177, -'7',14,217,'1',173,206,228,'t',250,200,170,162,'d','2','Z','$','e',168,224, -223,129,174,229,165,187,252,203,'-',28,'`',207,183,'-','/',127,196,230,131, -'B',30,237,' ',8,26,194,'O',132,'L','K','\\',144,'L','c',1,10,176,192,'c', -0,244,2,168,3,0,'+',233,186,16,17,'P',17,129,252,'2',0,2,154,247,255,166, -'.',228,138,'p',161,' ',142,22,8,198}; - DEFINE_TEST(test_read_format_isorr_bz2) { + const char *refname = "test_read_format_isorr_bz2.iso.bz2"; struct archive_entry *ae; struct archive *a; const void *p; size_t size; off_t offset; + + extract_reference_file(refname); assert((a = archive_read_new()) != NULL); - assert(0 == archive_read_support_compression_all(a)); - assert(0 == archive_read_support_format_all(a)); - assert(0 == archive_read_open_memory(a, archive, sizeof(archive))); + assertEqualInt(0, archive_read_support_compression_all(a)); + assertEqualInt(0, archive_read_support_format_all(a)); + assertEqualInt(0, archive_read_open_filename(a, refname, 10240)); /* First entry is '.' root directory. */ - assert(0 == archive_read_next_header(a, &ae)); + assertEqualInt(0, archive_read_next_header(a, &ae)); assertEqualString(".", archive_entry_pathname(ae)); assert(S_ISDIR(archive_entry_stat(ae)->st_mode)); assertEqualInt(2048, archive_entry_size(ae)); - assertEqualInt(1, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); assertEqualInt(0, archive_entry_mtime_nsec(ae)); - assertEqualInt(1, archive_entry_ctime(ae)); + assertEqualInt(86401, archive_entry_ctime(ae)); assertEqualInt(0, archive_entry_stat(ae)->st_nlink); assertEqualInt(0, archive_entry_uid(ae)); assertEqualIntA(a, ARCHIVE_EOF, @@ -115,66 +73,66 @@ assertEqualInt(size, 0); /* A directory. */ - assert(0 == archive_read_next_header(a, &ae)); + assertEqualInt(0, archive_read_next_header(a, &ae)); assertEqualString("dir", archive_entry_pathname(ae)); assert(S_ISDIR(archive_entry_stat(ae)->st_mode)); - assert(2048 == archive_entry_size(ae)); - assert(1 == archive_entry_mtime(ae)); - assert(1 == archive_entry_atime(ae)); - assert(2 == archive_entry_stat(ae)->st_nlink); - assert(1 == archive_entry_uid(ae)); - assert(2 == archive_entry_gid(ae)); + assertEqualInt(2048, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); /* A regular file. */ - assert(0 == archive_read_next_header(a, &ae)); + assertEqualInt(0, archive_read_next_header(a, &ae)); assertEqualString("file", archive_entry_pathname(ae)); assert(S_ISREG(archive_entry_stat(ae)->st_mode)); - assert(6 == archive_entry_size(ae)); - assert(0 == archive_read_data_block(a, &p, &size, &offset)); - assert(6 == size); - assert(0 == offset); - assert(0 == memcmp(p, "hello\n", 6)); - assert(1 == archive_entry_mtime(ae)); - assert(1 == archive_entry_atime(ae)); - assert(2 == archive_entry_stat(ae)->st_nlink); - assert(1 == archive_entry_uid(ae)); - assert(2 == archive_entry_gid(ae)); + assertEqualInt(6, archive_entry_size(ae)); + assertEqualInt(0, archive_read_data_block(a, &p, &size, &offset)); + assertEqualInt(6, size); + assertEqualInt(0, offset); + assertEqualInt(0, memcmp(p, "hello\n", 6)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); /* A hardlink to the regular file. */ - assert(0 == archive_read_next_header(a, &ae)); + assertEqualInt(0, archive_read_next_header(a, &ae)); assertEqualString("hardlink", archive_entry_pathname(ae)); assert(S_ISREG(archive_entry_stat(ae)->st_mode)); assertEqualString("file", archive_entry_hardlink(ae)); - assert(6 == archive_entry_size(ae)); - assert(1 == archive_entry_mtime(ae)); - assert(1 == archive_entry_atime(ae)); - assert(2 == archive_entry_stat(ae)->st_nlink); - assert(1 == archive_entry_uid(ae)); - assert(2 == archive_entry_gid(ae)); + assertEqualInt(6, archive_entry_size(ae)); + assertEqualInt(86401, archive_entry_mtime(ae)); + assertEqualInt(86401, archive_entry_atime(ae)); + assertEqualInt(2, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); /* A symlink to the regular file. */ - assert(0 == archive_read_next_header(a, &ae)); + assertEqualInt(0, archive_read_next_header(a, &ae)); assertEqualString("symlink", archive_entry_pathname(ae)); assert(S_ISLNK(archive_entry_stat(ae)->st_mode)); assertEqualString("file", archive_entry_symlink(ae)); - assert(0 == archive_entry_size(ae)); - assert(-2 == archive_entry_mtime(ae)); - assert(-2 == archive_entry_atime(ae)); - assert(1 == archive_entry_stat(ae)->st_nlink); - assert(1 == archive_entry_uid(ae)); - assert(2 == archive_entry_gid(ae)); + assertEqualInt(0, archive_entry_size(ae)); + assertEqualInt(172802, archive_entry_mtime(ae)); + assertEqualInt(172802, archive_entry_atime(ae)); + assertEqualInt(1, archive_entry_stat(ae)->st_nlink); + assertEqualInt(1, archive_entry_uid(ae)); + assertEqualInt(2, archive_entry_gid(ae)); /* End of archive. */ - assert(ARCHIVE_EOF == archive_read_next_header(a, &ae)); + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); /* Verify archive format. */ - assert(archive_compression(a) == ARCHIVE_COMPRESSION_BZIP2); - assert(archive_format(a) == ARCHIVE_FORMAT_ISO9660_ROCKRIDGE); + assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2); + assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE); /* Close the archive. */ - assert(0 == archive_read_close(a)); + assertEqualInt(0, archive_read_close(a)); #if ARCHIVE_API_VERSION > 1 - assert(0 == archive_read_finish(a)); + assertEqualInt(0, archive_read_finish(a)); #else archive_read_finish(a); #endif ==== //depot/projects/hammer/sys/amd64/amd64/pmap.c#181 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.622 2008/06/20 05:22:09 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.623 2008/06/21 19:19:09 alc Exp $"); /* * Manages physical address maps. @@ -448,8 +448,10 @@ /* Read-only from zero to physfree */ /* XXX not fully used, underneath 2M pages */ for (i = 0; (i << PAGE_SHIFT) < *firstaddr; i++) { - ((pt_entry_t *)KPTphys)[i] = i << PAGE_SHIFT; - ((pt_entry_t *)KPTphys)[i] |= PG_RW | PG_V | PG_G; + ((pt_entry_t *)KPTphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + PAGE_SIZE + i] = i << PAGE_SHIFT; + ((pt_entry_t *)KPTphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + PAGE_SIZE + i] |= PG_RW | PG_V | PG_G; } /* Now map the page tables at their location within PTmap */ @@ -461,8 +463,10 @@ /* Map from zero to end of allocations under 2M pages */ /* This replaces some of the KPTphys entries above */ for (i = 0; (i << PDRSHIFT) < *firstaddr; i++) { - ((pd_entry_t *)KPDphys)[i] = i << PDRSHIFT; - ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V | PG_PS | PG_G; + ((pd_entry_t *)KPDphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + NBPDR + i] = i << PDRSHIFT; + ((pd_entry_t *)KPDphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + NBPDR + i] |= PG_RW | PG_V | PG_PS | PG_G; } /* And connect up the PD to the PDP */ ==== //depot/projects/hammer/sys/netinet/libalias/alias.c#9 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.63 2008/06/01 17:52:40 mav Exp $"); +__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.64 2008/06/21 20:18:57 mav Exp $"); /* Alias.c provides supervisory control for the functions of the @@ -271,7 +271,7 @@ int create); static int UdpAliasIn(struct libalias *, struct ip *); -static int UdpAliasOut(struct libalias *, struct ip *, int create); +static int UdpAliasOut(struct libalias *, struct ip *, int, int create); static int TcpAliasIn(struct libalias *, struct ip *); static int TcpAliasOut(struct libalias *, struct ip *, int, int create); @@ -717,19 +717,18 @@ struct alias_link *lnk; LIBALIAS_LOCK_ASSERT(la); -/* Return if proxy-only mode is enabled */ - if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) - return (PKT_ALIAS_OK); ud = (struct udphdr *)ip_next(pip); lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst, ud->uh_sport, ud->uh_dport, - IPPROTO_UDP, 1); + IPPROTO_UDP, !(la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)); if (lnk != NULL) { struct in_addr alias_address; struct in_addr original_address; + struct in_addr proxy_address; u_short alias_port; + u_short proxy_port; int accumulate; int r = 0, error; struct alias_data ad = { @@ -744,8 +743,10 @@ alias_address = GetAliasAddress(lnk); original_address = GetOriginalAddress(lnk); + proxy_address = GetProxyAddress(lnk); alias_port = ud->uh_dport; ud->uh_dport = GetOriginalPort(lnk); + proxy_port = GetProxyPort(lnk); /* Walk out chain. */ error = find_handler(IN, UDP, la, pip, &ad); @@ -757,8 +758,32 @@ accumulate -= ud->uh_dport; accumulate += twowords(&alias_address); accumulate -= twowords(&original_address); + +/* If this is a proxy packet, modify checksum because of source change.*/ + if (proxy_port != 0) { + accumulate += ud->uh_sport; + accumulate -= proxy_port; + } + + if (proxy_address.s_addr != 0) { + accumulate += twowords(&pip->ip_src); + accumulate -= twowords(&proxy_address); + } + ADJUST_CHECKSUM(accumulate, ud->uh_sum); } +/* XXX: Could the two if's below be concatenated to one ? */ +/* Restore source port and/or address in case of proxying*/ + + if (proxy_port != 0) + ud->uh_sport = proxy_port; + + if (proxy_address.s_addr != 0) { + DifferentialChecksum(&pip->ip_sum, + &proxy_address, &pip->ip_src, 2); + pip->ip_src = proxy_address; + } + /* Restore original IP address */ DifferentialChecksum(&pip->ip_sum, &original_address, &pip->ip_dst, 2); @@ -776,19 +801,50 @@ } static int -UdpAliasOut(struct libalias *la, struct ip *pip, int create) +UdpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create) { struct udphdr *ud; struct alias_link *lnk; + struct in_addr dest_address; + struct in_addr proxy_server_address; + u_short dest_port; + u_short proxy_server_port; + int proxy_type; int error; LIBALIAS_LOCK_ASSERT(la); -/* Return if proxy-only mode is enabled */ - if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) + +/* Return if proxy-only mode is enabled and not proxyrule found.*/ + ud = (struct udphdr *)ip_next(pip); + proxy_type = ProxyCheck(la, &proxy_server_address, + &proxy_server_port, pip->ip_src, pip->ip_dst, + ud->uh_dport, pip->ip_p); + if (proxy_type == 0 && (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)) return (PKT_ALIAS_OK); - ud = (struct udphdr *)ip_next(pip); +/* If this is a transparent proxy, save original destination, + * then alter the destination and adjust checksums */ + dest_port = ud->uh_dport; + dest_address = pip->ip_dst; + + if (proxy_type != 0) { + int accumulate; + + accumulate = twowords(&pip->ip_dst); + accumulate -= twowords(&proxy_server_address); + + ADJUST_CHECKSUM(accumulate, pip->ip_sum); + if (ud->uh_sum != 0) { + accumulate = twowords(&pip->ip_dst); + accumulate -= twowords(&proxy_server_address); + accumulate += ud->uh_dport; + accumulate -= proxy_server_port; + ADJUST_CHECKSUM(accumulate, ud->uh_sum); + } + pip->ip_dst = proxy_server_address; + ud->uh_dport = proxy_server_port; + } lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst, ud->uh_sport, ud->uh_dport, IPPROTO_UDP, create); @@ -805,6 +861,16 @@ .maxpktsize = 0 }; +/* Save original destination address, if this is a proxy packet. + * Also modify packet to include destination encoding. This may + * change the size of IP header. */ + if (proxy_type != 0) { + SetProxyPort(lnk, dest_port); + SetProxyAddress(lnk, dest_address); + ProxyModify(la, lnk, pip, maxpacketsize, proxy_type); + ud = (struct udphdr *)ip_next(pip); + } + alias_address = GetAliasAddress(lnk); alias_port = GetAliasPort(lnk); @@ -1409,7 +1475,7 @@ iresult = IcmpAliasOut(la, pip, create); break; case IPPROTO_UDP: - iresult = UdpAliasOut(la, pip, create); + iresult = UdpAliasOut(la, pip, maxpacketsize, create); break; case IPPROTO_TCP: iresult = TcpAliasOut(la, pip, maxpacketsize, create); ==== //depot/projects/hammer/tools/regression/lib/libc/stdio/test-scanfloat.c#8 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include -__FBSDID("$FreeBSD: src/tools/regression/lib/libc/stdio/test-scanfloat.c,v 1.9 2007/12/09 21:00:12 das Exp $"); +__FBSDID("$FreeBSD: src/tools/regression/lib/libc/stdio/test-scanfloat.c,v 1.10 2008/06/21 19:28:26 das Exp $"); #include #include @@ -49,8 +49,9 @@ long double ld = 0.0; double d = 0.0; float f = 0.0; + char *endp; - printf("1..3\n"); + printf("1..4\n"); buf[0] = '\0'; assert(setlocale(LC_NUMERIC, "")); @@ -274,6 +275,15 @@ printf("ok 3 - scanfloat\n"); + /* + * Tests specific to strtod(). + */ + + assert(strtod("0xy", &endp) == 0); + assert(strcmp("xy", endp) == 0); + + printf("ok 4 - scanfloat\n"); + return (0); }