は、私は、Linux hwmonデバイスのために繰り返し使用次のコードスニペットを見てきました:Linuxのhwmonでsprintfのバッファオーバーフローが起こるのはなぜですか?
return sprintf(buf, "%d\n", in_input);
buf
が
char *buf
をcharへのポインタである
、そしてin_input
通常int
またはu16
。目的は、デバイスから読み取られた値を、このデバイス属性用に作成されたsysfsファイルにコピーすることです。
例として、Linux/drivers/hwmon/mcp3021.c(または実際に4.9カーネルの前の任意のhwmonデバイス)を見ることができます。 81行目の関数がを返し、99行目でu16
がchar *buf
に格納されていることがわかります。
81 static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
82 {
83 return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
84 }
85
86 static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
87 char *buf)
88 {
89 struct i2c_client *client = to_i2c_client(dev);
90 struct mcp3021_data *data = i2c_get_clientdata(client);
91 int reg, in_input;
92
93 reg = mcp3021_read16(client);
94 if (reg < 0)
95 return reg;
96
97 in_input = volts_from_reg(data, reg);
98
99 return sprintf(buf, "%d\n", in_input);
100 }
このコードでは常にバッファオーバーフローが発生しませんか?私たちは常にchar16ビットに割り当てられたバッファにu16を格納しています。 Linuxデバイスドライバでこれがなぜ許可されていますか?
全く同じことをする私のドライバでは、sysfsはchar(8ビット)として格納できない場合でも、返された値を正しく表示することに注意してください。だからchar *
の表現が正確ではないのだろうか?
質問: 'snprintf()'はカーネルモードで利用できますか? – wildplasser
良い質問、私は確かにそれを見つけることができます:http://lxr.free-electrons.com/source/include/linux/kernel.h#L411。しかし、私はそれを使用して華人の誰かが表示されません。 – Splaty
問題のポインタが十分大きいメモリブロックを指している場合、問題はありません。 –