git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Add git-imap-send.

From
Linus Torvalds <torvalds@osdl.org>
Date
Mar 9, 2006, 16:41 UTC
Message-ID
<Pine.LNX.4.64.0603090836030.18022@g5.osdl.org>
In-Reply-To
<Pine.LNX.4.63.0603091227560.20277@wbgn013.biozentrum.uni-wuerzburg.de>
On Thu, 9 Mar 2006, Johannes Schindelin wrote:
Show 9 quoted lines
> > 
> > > +		if (!memcmp( "imaps:", val, 6 )) {
> > > +			if (!memcmp( "imap:", val, 5 ))
> > 
> > Is val always longer than 5 or 6 bytes here?
> 
> That does not matter, since they are strings, and the memcmp should not 
> look further if they are shorter (because the comparison to '\0' failed 
> already).
No.

It's true that any sane memcmp() will stop when it notices a difference, and it's also true that the return value semantics of memcmp() means that it has to walk beginning-to-end.

HOWEVER. The key phrase is "_when_ it notices a difference".

It's quite common for optimized memcmp()'s to do things like loading several words from both the source and the destinations, and testing them together, and only start doing the byte-by-byte comparison when the "big" comparison has failed.

So when you do a
	if (!memcmp(string, mystring, mystringlength))
		...

it's entirely possible that it will load bytes from "string" _past_ the end of the string because of an unrolled inner loop that does things multiple bytes at a time. They won't be used in the eventual result, but just the fact that they are loaded from memory can mean that your program takes a SIGSEGV, for example, becaue it turns out "string" was just a single NUL byte at the end of a page, and there's nothing after it.

IOW, it's a bad optimization.

Use "strncmp()" instead. Yes, it can be slower, exactly because it has to check more, but it checks more exactly because memcmp() can cause undefined behaviour by running off the end of a string.

		Linus
Previous: Mark WoodingNext: Junio C Hamano
Message 9 of 13 in “Add git-imap-send.”
  1. Add git-imap-send.Mike McCormack, Mar 6, 2006
  2. Junio C HamanoMar 9, 2006
  3. Johannes SchindelinMar 9, 2006
  4. Andreas EricssonMar 9, 2006
  5. Johannes SchindelinMar 9, 2006
  6. Mark WoodingMar 9, 2006
  7. Johannes SchindelinMar 9, 2006
  8. Mark WoodingMar 10, 2006
  9. Linus TorvaldsMar 9, 2006
  10. Junio C HamanoMar 9, 2006
  11. Linus TorvaldsMar 9, 2006
  12. Junio C HamanoMar 9, 2006
  13. Mike McCormackMar 10, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.