<div dir="ltr">staging: drivers: video: fbdev: core: fbcon: Fix getting font from fbcon<br><br>The patch fixes the problem of getting fonts from fbcon when the font's width spans over 3 bytes.<br>The bug can be reproduced inside linux console running fbcon in following way:<br><br>Set font with width in range 17-24, ie: solar24x32.psfu can be downloaded from kbd package<br>> setfont /usr/share/consolefonts/solar24x32.psfu<br><br>Try to read it back:<br>> setfont -O font.psfu<br><br>Before the fix, it will diplay:<br>> get_font: GIO_FONT: Invalid argument<br><br>On patched kernel it will output font.psfu file<br>Now we can confirm it is a valid font file:<br>> setfont font.psfu<br><br>Signed-off-by: Marcin Sokalski <<a href="mailto:msokalski@novomatic-tech.com">msokalski@novomatic-tech.com</a>><br><br>diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c<br>index 99ecd9a6d844..1f599872cae5 100644<br>--- a/drivers/video/fbdev/core/fbcon.c<br>+++ b/drivers/video/fbdev/core/fbcon.c<br>@@ -1806,18 +1806,15 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)<br>                  fontdata += j;<br>               }<br>    } else if (font->width <= 24) {<br>-                if (font->charcount * (vc->vc_font.height * sizeof(u32)) > FNTSIZE(fontdata))<br>+               j = vc->vc_font.height * 3;<br>+               if (font->charcount * j > FNTSIZE(fontdata))<br>                   return -EINVAL;<br> <br>          for (i = 0; i < font->charcount; i++) {<br>-                        for (j = 0; j < vc->vc_font.height; j++) {<br>-                             *data++ = fontdata[0];<br>-                               *data++ = fontdata[1];<br>-                               *data++ = fontdata[2];<br>-                               fontdata += sizeof(u32);<br>-                     }<br>-                    memset(data, 0, 3 * (32 - j));<br>-                       data += 3 * (32 - j);<br>+                        memcpy(data, fontdata, j);<br>+                   memset(data + j, 0, 96 - j);<br>+                 data += 96;<br>+                  fontdata += j;<br>               }<br>    } else {<br>             j = vc->vc_font.height * 4;</div>

<br>
<div><font face="Arial, Helvetica, sans-serif" size="2">CONFIDENTIALITY NOTICE</font></div><div><font face="Arial, Helvetica, sans-serif" size="2">------------------------------<wbr>------</font></div><div><font face="Arial, Helvetica, sans-serif" size="2">This E-mail is intended only to be read or used by the addressee.The information contained in this E-mail message may be confidential information. If you are not the intended recipient, any use, interference with, distribution, disclosure or copying of this material is unauthorised and prohibited. Confidentiality attached to this communication is not waived or lost by reason of the mistaken delivery to you.</font></div><div><font face="Arial, Helvetica, sans-serif" size="2">If you have received this message in error, please delete it and notify us by return E-mail or telephone NOVOMATIC Technologies Poland Sp. z o.o. +48 12 258 00 50. Any E-mail attachment may contain software viruses which could damage your own computer system. Whilst reasonable precaution has been taken to minimize this risk, we cannot accept liability for any damage which you sustain as a result of software viruses. You should therefore carry out your own virus checks before opening any attachments.</font></div><div><font face="Arial, Helvetica, sans-serif" size="2">------------------------------<wbr>------</font></div><div><font face="Arial, Helvetica, sans-serif" size="2">NOVOMATIC Technologies Poland Sp. z o.o., Poland, Krakowska 368, 32-080 Zabierzów</font></div>