lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 24 Jul 2018 14:49:23 +1000 (AEST)
From:   Finn Thain <fthain@...egraphics.com.au>
To:     Randy Dunlap <rdunlap@...radead.org>
cc:     Andreas Schwab <schwab@...ux-m68k.org>,
        LKML <linux-kernel@...r.kernel.org>,
        Geert Uytterhoeven <geert@...ux-m68k.org>,
        linux-m68k@...ts.linux-m68k.org
Subject: Re: m68k allmodconfig build errors

On Mon, 23 Jul 2018, Randy Dunlap wrote:

> On 07/20/2018 12:20 AM, Andreas Schwab wrote:
> > On Jul 19 2018, Randy Dunlap <rdunlap@...radead.org> wrote:
> > 
> >> block/partitions/ldm.o: In function `ldm_partition':
> >> ldm.c:(.text+0x1900): undefined reference to `strcmp'
> >> ldm.c:(.text+0x1964): undefined reference to `strcmp'
> >> drivers/rtc/rtc-proc.o: In function `is_rtc_hctosys':
> >> rtc-proc.c:(.text+0x290): undefined reference to `strcmp'
> >> drivers/watchdog/watchdog_pretimeout.o: In function `watchdog_register_governor':
> >> (.text+0x142): undefined reference to `strcmp'
> > 
> > GCC has optimized strncmp to strcmp, but at a stage where macros are no
> > longer available.  I think the right fix is to use strcmp directly,
> > since strncmp doesn't make sense here.
> 
> Hi Andreas,
> 
> I don't see that all of these string compare fields are null-terminated.
> 

Some of the strncmp calls in ldm.c are null-terminated, some are not. 

That would imply that the compiler will emit both strcmp and strncmp 
calls.

A strncmp call isn't a problem, because m68k doesn't define 
__HAVE_ARCH_STRNCMP and so the one from lib/string.c gets built.

> How does one convert strncmp() users to strcmp()?
> 
> thanks,
> 

The untested patch below may work. It seems that it may be relevant to 
both arc and m68k:

$ diff -u <(egrep -rlw __HAVE_ARCH_STRCMP *) <(egrep -rlw __HAVE_ARCH_STRNCMP *)
--- /dev/fd/63  2018-07-24 14:22:56.180014584 +1000
+++ /dev/fd/62  2018-07-24 14:22:56.180014584 +1000
@@ -1,11 +1,12 @@
 arch/mips/include/asm/string.h
 arch/x86/lib/string_32.c
 arch/x86/include/asm/string_32.h
-arch/m68k/include/asm/string.h
 arch/xtensa/include/asm/string.h
 arch/sh/include/asm/string_32.h
+arch/powerpc/include/asm/string.h
 arch/s390/include/asm/string.h
 arch/arm64/include/asm/string.h
-arch/arc/include/asm/string.h
+arch/sparc/include/asm/string.h
+drivers/firmware/efi/libstub/string.c
 include/linux/string.h
 lib/string.c

How can all those __HAVE_ARCH_FOO feature macros work properly if the 
compiler makes assumptions about libc availability? Isn't that assumption 
invalidated by -ffreestanding?

Surely the strcmp optimization is only valid when there is a 
__builtin_strcmp?

-- 

diff --git a/block/partitions/ldm.c b/block/partitions/ldm.c
index 0417937dfe99..4b9927344593 100644
--- a/block/partitions/ldm.c
+++ b/block/partitions/ldm.c
@@ -150,8 +150,7 @@ static bool ldm_parse_tocblock (const u8 *data, struct tocblock *toc)
 	toc->bitmap1_start = get_unaligned_be64(data + 0x2E);
 	toc->bitmap1_size  = get_unaligned_be64(data + 0x36);
 
-	if (strncmp (toc->bitmap1_name, TOC_BITMAP1,
-			sizeof (toc->bitmap1_name)) != 0) {
+	if (strcmp(toc->bitmap1_name, TOC_BITMAP1) != 0) {
 		ldm_crit ("TOCBLOCK's first bitmap is '%s', should be '%s'.",
 				TOC_BITMAP1, toc->bitmap1_name);
 		return false;
@@ -160,8 +159,7 @@ static bool ldm_parse_tocblock (const u8 *data, struct tocblock *toc)
 	toc->bitmap2_name[sizeof (toc->bitmap2_name) - 1] = 0;
 	toc->bitmap2_start = get_unaligned_be64(data + 0x50);
 	toc->bitmap2_size  = get_unaligned_be64(data + 0x58);
-	if (strncmp (toc->bitmap2_name, TOC_BITMAP2,
-			sizeof (toc->bitmap2_name)) != 0) {
+	if (strcmp(toc->bitmap2_name, TOC_BITMAP2) != 0) {
 		ldm_crit ("TOCBLOCK's second bitmap is '%s', should be '%s'.",
 				TOC_BITMAP2, toc->bitmap2_name);
 		return false;
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c
index a9dd9218fae2..5f9a5a720b4d 100644
--- a/drivers/rtc/rtc-proc.c
+++ b/drivers/rtc/rtc-proc.c
@@ -30,7 +30,7 @@ static bool is_rtc_hctosys(struct rtc_device *rtc)
 	if (size > NAME_SIZE)
 		return false;
 
-	return !strncmp(name, CONFIG_RTC_HCTOSYS_DEVICE, NAME_SIZE);
+	return !strcmp(name, CONFIG_RTC_HCTOSYS_DEVICE);
 }
 #else
 static bool is_rtc_hctosys(struct rtc_device *rtc)
diff --git a/drivers/watchdog/watchdog_pretimeout.c b/drivers/watchdog/watchdog_pretimeout.c
index 9db07bfb4334..d4797452b011 100644
--- a/drivers/watchdog/watchdog_pretimeout.c
+++ b/drivers/watchdog/watchdog_pretimeout.c
@@ -136,8 +136,7 @@ int watchdog_register_governor(struct watchdog_governor *gov)
 	priv->gov = gov;
 	list_add(&priv->entry, &governor_list);
 
-	if (!strncmp(gov->name, WATCHDOG_PRETIMEOUT_DEFAULT_GOV,
-		     WATCHDOG_GOV_NAME_MAXLEN)) {
+	if (!strcmp(gov->name, WATCHDOG_PRETIMEOUT_DEFAULT_GOV)) {
 		spin_lock_irq(&pretimeout_lock);
 		default_gov = gov;
 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ