标签归档:bug

[原] netty 4.0.17.Final使用epoll模式的几个bug

netty支持linux的epoll是4.0.17.Final引入的新功能,不过测试使用发现几个bug。暂记如下:

[已解决的]
使用epoll时channel关闭错误

原因:Native.finishConnect()中有bug
见这里:https://github.com/netty/netty/issues/2280
下载最新代码编译package可解决。包括编译Native的c代码:

[未解决的]
使用epoll时channel中取不到localAddress()和remoteAddress()

log:

github上有相关的issue: https://github.com/netty/netty/issues/2262
虽然标记为已解决,但编译4.0最新的代码(4.0.18.Final-SNAPSHOT)错误仍在。
先记录下,明天再来看怎么回事。

[原] Delphi加密解密控件DCPcrypt的RC4实现bug

作者David Barton网站:http://www.cityinthesky.co.uk/opensource/dcpcrypt
DCPcrypt v2 contains full implementations of the following algorithms:
Encryption Algorithms Hash Algorithms
Blowfish Haval
Cast 128 MD4
Cast 256 MD5
DES, 3DES RipeMD-128
Ice, Thin Ice, Ice2 RipeMD-160
IDEA SHA-1
Mars SHA-256, SHA-384, SHA-512
Misty1 Tiger
RC2, RC4, RC5, RC6
Rijndael (the AES)
Serpent
Tea
Twofish
不过我试了最新的控件,RC4实现还是有bug:8192字节后,加密的数据不是标准的。(和C语言比)
如果你全都用这个控件来实现RC4的加密/解密,或者数据块不超过8192字节,那没有问题;
不过如果你跨语言了(即用Delphi加密,其他语言解密;或者其他语言加密,Delphi解密),而且数据块超过8192字节,那一定会遇到这个bug:8192字节后的加密/解密内容不匹配。

【补充】经过阅读代码,我发现了这个bug的原因:
在 DCPcrypt2.pas 中, 当调用 TDCP_cipher.EncryptStream 时,作者把Stream 按照8192字节分成几部分,然后对每一部分调用Encrypt函数。问题就出在这里,因为RC4的算法,KeyData[0..255]这个数组是不断在变化的。作者分块以后,调用Encrypt()偏移量又重新从下标0开始算。就会导致问题:

[原] HTTP Authorization Digest 方式以及XP映射网络驱动器的身份认证bug

HTTP Authorization Digest 方式具体是这样算的:
username:realm:password —md5—> a1md5
HttpMethod:Uri —md5—> a2md5
a1md5:nonce:nc:cnonce:qop:a2md5 —md5—> response
但是XP下映射网络驱动器的身份认证存在bug:username中它会带上域名
也就是:发送的username = domain.com\username
server端要fix这个bug,如果只是简单把username里的域名去掉是不行的。
因为response是根据带域名的username算出来的,直接去掉会导致response不匹配,无法通过认证。
而要这样解决:
计算response时保留带域名的username,但是根据username取password时又要去掉域名。

[原] 解决VS2010 sp1安装Silverlight 5 Tools重启后无法识别的奇怪问题

基本上第二天重启后,再打开Silverlight 5的项目,就提示“在打开Silverlight项目之前,您需要安装最新的Silverlight Developer运行时”。
解决办法:
卸载Silverlight有关的一切东西(卸载Silverlight 3/4/5 SDK,卸载Silverlight 5 Tookit,等);
再重装Silverlight 5 Tools,重装Silverlight 5 Tookit。可以解决这个问题,但是搞了几次,十分恼火。
今天下决心,发现问题原因:
Silverlight 5 SDK(Developer Runtime)的版本是5.0,
Silverlight 5 (Runtime)默认是自动更新的,会自动更新到5.1
如果Runtime和Developer Runtime版本不一,好像会出现这个问题。关闭了Silverlight 5的自动更新,观察一下,等后续报道。
参考链接:Problem with Silverlight 5 developer run-time

[原] ftp4j的解析list的bug及解决

上次推荐的ftp4j在解析部分FTP站点的目录list的时候遇到了FTPListParseException(也怪FTP协议没有对LIST格式作出标准)。查看源码发现,主要是两个问题:
1)文件权限不只rwx这三个,附加了s、t(详见http://en.wikipedia.org/wiki/File_system_permissions
2)部分ftpd似乎直接调用的“ls -l”输出目录,第一行是“total xxx”
给作者写信了,说不定下个版本就有Sepcial Thanks to bianbian 了。嘿嘿嘿嘿。。。
修正后的代码(省略后面没有变化的部分):
继续阅读

[原] php读取二进制流(C语言结构体struct数据文件)

尽管php是用C语言开发的,不过令我不解的是php没有提供对结构体struct的直接支持。
不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转:

其中,$format跟perl里的pack格式类似,有如下一些(中文是我加的,有不准确的欢迎提出):
a NUL-padded string,即“\0”作为“空字符”的表示形式
A SPACE-padded string,空格作为“空字符”的表示形式
h Hex string, low nibble first,升序位顺序
H Hex string, high nibble first,降序位顺序
c signed char,有符号单字节
C unsigned char,无符号单字节
s signed short (always 16 bit, machine byte order)
S unsigned short (always 16 bit, machine byte order)
n unsigned short (always 16 bit, big endian byte order)
v unsigned short (always 16 bit, little endian byte order)
i signed integer (machine dependent size and byte order)
I unsigned integer (machine dependent size and byte order)
l signed long (always 32 bit, machine byte order)
L unsigned long (always 32 bit, machine byte order)
N unsigned long (always 32 bit, big endian byte order)
V unsigned long (always 32 bit, little endian byte order)
f float (machine dependent size and representation)
d double (machine dependent size and representation)
x NUL byte,实际使用的时候作为跳过多少字节用,很有用
X Back up one byte,后退1字节
@ NUL-fill to absolute position,实际使用的时候作为从开头跳到某字节用,很有用

实际使用发现:C里的“\0”(即字符串终止符)在php里并不是终止符,而是作为了字符串的一部分。因此,必须对“\0”进行特殊处理,才能进行struct和php内部数据的完美互转。比如 char name[10]; 如果实际数据是“62 69 61 6E 00 62 69 61 6E 00”,在C语言里第5个位置有终止符,name应该是“bian”;而用了unpack转换以后在php里的name却是“bian\0bian\0”。
一开始我用了strpos函数找到“\0”的位置,然后进行substr截取:

不过很Faint的事情发生了,不知道是strpos的bug还是substr的bug(其实测试一下就知道,懒得试),有些字符串没问题,有些字符串却只能得到空值(即$name == ”)。很是郁闷,后来找了个strtok函数,这下没有问题了:

难为大家看了那么多,下面写个完整的php读取二进制数据流(C语言结构体struct数据)文件的示例代码:
首先是C的struct定义示例,为了演示,我就写个简单点的,实际对照上面那个$format格式表应该没有问题:

比如有个“bianbian.org”文件,内容就是上面的N个BIANBIAN结构体构成的。读取的php代码:

pack应该跟unpack相反。

[原] IDL剪贴板绘图在其他语言调用下失效的bug

经过运行剪贴板监视器程序,我确认这是IDL的bug:如果用VC等其他语言调用IDL绘图,IDL并不能通过IDLgrClipboard对象将绘图结果保存到系统剪贴板(而在IDL的编辑器环境下运行,剪贴板是能得到绘图结果的)。
下面是英文描述:
IDLgrClipboard not works in callable mode (I use VC++ to execute IDL procedure to draw some plots, and copy the result to system clipboard). After running a system-clipboard-viewer-tool, I conclude it must be a bug (I tested with IDL6.2, IDL7.0).

It works well under IDL-workbench, but when call from VC++, everything else goes OK except clipboard is empty.

解决办法:只好制定FILENAME参数,将结果保存到文件:
Finally, I have no choise but to save the drawing to a file, and it works:

[原] 也许是prototype框架的bug

不知道怎么给prototype提交bug report,就写在这里吧:
其实我没有测试过,只是看prototype源码的时候,觉得是个bug:
对String的原型(prototype)添加toJSON()函数只是转义了引号,未转义”\”:

如果用户在input里输入\\,转成string应该是”\\\\”,如果没有转义,再写回去的时候就丢了一个\
应该在转义引号前先转义\:

[晕] 发现gmail的问题

附件里不能发可执行文件。就算用tgz压缩过的,里面有x属性的还是不行。
说什么有可能危害安全。。。。结果发个已编译的开源项目文件也不行。。。
话说,我发什么关你啥事啊?你不是有病毒扫描吗?

[原] PHP bug or Slackware bug? –enable-fastcgi always failed.

On Slackware 12.0, compile php to fastcgi alwayes failed, only get CGI:

so use spawn-fcgi (lighttpd) always get exit.

OH MY GOD…. I tried from php 4.3.0 – php 5.2.0, only php 4.4.4 can get fastcgi:

why??????????????????????

[晕] nginx的internal属性的bug

文档上说,internal用来禁止用户直接通过地址访问。
syntax: internal
default: no
context: location

internal indicates that the matching location can be used only for so called “internal” requests.
For external requests it will return the error “Not found” (404).
Internal requests are the following:
1) requests redirected by the instruction error_page
2) subrequests created by the command include virtual of the “ngx_http_ssi_module” module
3) requests changed by the instruction rewrite of the “ngx_http_rewrite_module” module

An example to prevent clients fetching error pages directly:

实际发现,rewrite的用internal修饰后就挂了。像下面这个配置,如果/realpath/设了internal,用/proxypath/访问就是404。
这个跟本意是违背的(本意只能通过/proxypath/访问,而隐藏/realpath/),应该是nginx的bug(我的版本0.5.32)

[呜]招行的系统咋那么多问题,这次是ATM存款

可能确实是本命年倒霉,存进去的5K人间蒸发了。。。。
当时也没查余额,凭条也顺手丢了。。。。
晚上打开专业版傻眼了,啥都没有。。。。
95555电话询问,他们似乎见惯了,说明天去柜台登记,查一下ATM的日志就会补给我。

但是。。。。俺对招行的信任正一步步丧失。。。。除了服务态度好,能不能让我放心啊?

[原]windows命令Copy合并多文件的bug及解决

先来看看copy的语法:

C:\Documents and Settings\Administrator>copy /?
将一份或多份文件复制到另一个位置。

COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ …]] [destination [/A | /B]]

source 指定要复制的文件。
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D 允许解密要创建的目标文件
destination 为新文件指定目录和/或文件名。
/V 验证新文件写入是否正确。
/N 复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y 不使用确认是否要改写现有目标文件
的提示。
/-Y 使用确认是否要改写现有目标文件
的提示。
/Z 用可重新启动模式复制已联网的文件。

命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批文件脚本中执行的,默认值应为
在改写时进行提示。

要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。

其中,file1+file2+file3还是挺好用的,我一般拿来合并JS脚本,比如:
copy bianbian.main.js + bianbian.DOM.js + bianbian.other.js bianbian.src.js /Y
jsmin <bianbian.src.js >bianbian.js
(用jsmin来删除注释缩进等等,让代码小一点)。

不过,现在发现多文件合并有bug:
1)合并以后在文件末尾会产生一个奇怪的字符(十六进制ASCII码为”1A”),如果直接引用这个js,则任何浏览器都会报错。不过这个字符用jsmin了以后就会被删除,所以这个bug倒并不要紧

2)如果这些文件格式是UTF-8的,合并的时候不会删除每个文件的UTF-8头声明,导致解析出错。我们知道UTF-8格式的文件会用“FF FE”开头(可以看做UTF-8声明),而copy只是简单地将所有文件的ASCII码合并,所以合并后的文件正文也会有“FF FE”。这样,会导致每个源文件第一行的脚本解析出错(比如function,会解析成 ?unction,此处问号表示不认识的字符。不过这个解析目前只在Opera下发现出错)
。解决的办法是每个源文件的第一行都留空,不要写脚本。

[原] IE在UTF-8下解析JavaScript的bug

莫名其妙的脚本问题,脚本肯定没有写错,在IE中就是报错,在Firefox中一切正常:页面是UTF-8的,脚本用了:

插入页面。
(略去若干抓狂文字。。。。。。)
bianbian.js是ANSI编码的,用记事本保存为UTF-8编码,错误没有了。我觉得是IE的bug:页面是UTF-8编码的,为什么一定要求引用的其他文件也是UTF-8?
下次遇到IE下脚本很奇怪的错误不如看看JavaScript脚本和页面的编码是不是一致。