[sane-devel] Canon ImageClass MF644Cdw

Louis Lagendijk louis at fazant.net
Mon Nov 4 22:27:27 GMT 2019

On Thu, 2019-10-31 at 16:31 -0700, Ralph Little wrote:
> Hi,
> On Thu, Oct 31, 2019 at 4:12 PM David McMahon <thedjm at gmail.com>
> wrote:
> > Thanks for the clue!  Looking on that on the settings page of the
> > printer, the hostname is the default of "Canoncbcab3" which seems
> > harmless enough.  I changed it to "Can" to see if that changed
> > anything, but still getting the buffer overflow.
> > If you have a link handy to that part of the code, can you point me
> > to it?  Maybe it's something else right after the strcpy().
> >  
> Hmm, that might have been slightly misleading.
> I'm looking at backend/pixma_bjnp.c at line 801, which is where we
> see the last successful debug message from the function
> get_scanner_id():
> "get_scanner_id: Scanner model = ...."
> It returns to the only place it is called, line 1817 in
> add_scanner().
> We don't get the error message (at line 1819) so it must next call
> the function determine_scanner_serial() which attempts to determine a
> "serial number" for the scanner.
> This could be one of a selection of things, so that might be the
> culprit, since it does some strcpy() calls in there, although we
> don't have any debug messages in there, so we don't really know how
> far it got before the buffer overrun struck :(
> If it were me chasing this, I would add some more dbg messages to see
> how far it got, perhaps one after the call to
> determine_scanner_serial() to see if it returned to start off with.
> If it didn't some dbg in the function determine_scanner_serial() to
> see what it decided.
> Cheers,
> Ralph

Could be, but it may also be caused by the call to
parse_IEEE1284_to_model at the end of get_scanner_id. The use of
BJNP_IEEE1284_MAX in the strcpy (already replaced by a mecpy)  may be
incorrect there. It probably should be a strlen(tok + 4). The next line
should be removed, so  the code reads (with a bit of readability

tatic intparse_IEEE1284_to_model (char *scanner_id, char *model){/* *
parses the  IEEE1284  ID of the scanner to retrieve make and model * of
the scanner * Returns: 0 = not found *          1 = found, model is
set */
  char s[BJNP_IEEE1284_MAX];  char *tok;  char * model_str;
  strncpy (s, scanner_id, BJNP_IEEE1284_MAX);  s[BJNP_IEEE1284_MAX - 1]
= '\0';  model[0] = '\0';
  tok = strtok (s, ";");  while (tok != NULL)    {      /* MDL contains
make and model */
      if (strncmp (tok, "MDL:", 4) == 0)        {          model_str =
tok +4;          memcpy (model, model_str,
strlen(model_str));          return 1;        }      tok = strtok
(NULL, ";");    }  return 0;}
I will include this in my next push to git
BR, Louis

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/sane-devel/attachments/20191104/e130f2a5/attachment.html>

More information about the sane-devel mailing list