以前的笔记,今日翻出了复看了一下,转过来。

------------------------------------

今天发现xxxdump中使用xxx_strncpy 替换 strncpy导致的bug。
 
原因是strncpy:
 
Warning: If there is no  null byte among the first n bytes of src, the string placed in dest will not be null terminated.
 
但是xxx_strncpy会保证dest是0结尾。
 
典型的就是xxxdumpd中的xxx_info.c中的使用,原来使用strncpy没问题,但是替换了之后会导致str截断。
 
 
我们需要了解这个差异,避免以后的问题。
 
原则上,不再推荐使用原生的strncpy。
 
 
 
 
***security name***
2014-10-11
 
From: Cao Tong
Sent: Saturday, October 11, 2014 4:09 PM
Subject: Re: xxx_strncpy 推荐
 
r = xxx_strncpy(dst, src, n) 与 r =
strncpy(dst, src, n) 比较:

一: n>len(src)时,拷贝len(src)个字符后,strncpy
会将 len(src) 到 n 部分全部置零,xxx_strncpy只给 len(scr)+ 1 置零。
二:
n<=len(src)时,strncpy 只拷贝 n 个字符, xxx_strncpy拷贝n-1个,把第n个置零。
三:
返回值不同,见下边的例子。

char dst[10] =
"123456789";
0x7fffffffe3e0:    0x31   
0x32    0x33    0x34   
0x35    0x36    0x37   
0x38
0x7fffffffe3e8:    0x39    0x00
char*
src = "abcde";

1.  n = 8;

strncpy:
0x7fffffffe3e0:    0x61    0x62   
0x63    0x64    0x65   
0x00    0x00   
0x00
0x7fffffffe3e8:    0x39   
0x00
r = 0x7fffffffe3e0
"abcde"

xxx_strncpy:
0x7fffffffe3e0:    0x61    0x62   
0x63    0x64    0x65   
0x00    0x37   
0x38
0x7fffffffe3e8:    0x39    0x00
r =0x7fffffffe3e5 ""

2.  n = 2;

strncpy:
0x7fffffffe3e0:    0x61    0x62   
0x33    0x34    0x35   
0x36    0x37   
0x38
0x7fffffffe3e8:    0x39    0x00
r = 0x7fffffffe3e0
"ab3456789"

xxx_strncpy:
0x7fffffffe3e0:    0x61    0x00   
0x33    0x34    0x35   
0x36    0x37   
0x38
0x7fffffffe3e8:    0x39    0x00
r =  = 0x7fffffffe3e1 ""

-------------------
Cao Tong

-------- Original Message --------
Date:
2014/3/11 12:57

推荐使用xxx_strncpy 替代 strncpy
 
说明:
 
/*
* Apache's "replacement" for the strncpy()
function. We roll our
* own to implement these specific
changes:
*   (1) strncpy() doesn't always null terminate and we
want it to.
*   (2) strncpy() null fills, which is bogus, esp.
when copy 8byte
*       strings into 8k
blocks.
*   (3) Instead of returning the pointer to the beginning
of
*       the destination string, we return
a pointer to the
*       terminating '\0' to
allow us to "check" for truncation
*
* apr_cpystrn() follows the same
call structure as strncpy().
*/
 
char* xxx_strncpy(char *dst, const char *src,
size_t dst_size)
{
 
 
 
***security name***
2014-3-11

[skill] strncpy里边有两个坑的更多相关文章

  1. 两个坑-Linux下Network-Manager有线未托管-DNS resolv.conf文件开机被清空

    Linux里面有两套管理网络连接的方案: 1./etc/network/interfaces(/etc/init.d/networking) 2.Network-Manager 两套方案是冲突的,不能 ...

  2. iscroll遇到的两个坑

    最近移动端闪付遇到的两个坑做下总结: 1.使用iscroll后,滑动并没有生效 解决方案: 首先要查看:结构是否正确: <div id="wrapper">   //w ...

  3. 记自己在spring中使用redis遇到的两个坑

    本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅: 一.配置文件 <!-- 加载Properties文件 --> < ...

  4. MySql 5.7安装(随机密码,修改默认密码)两个坑

    MySql 5.7安装(随机密码,修改默认密 下载了MySql 最新版本,安装的过程中,发现了很多新特性 1.data目录不见了 在进行my-default.ini配置的时候 (需要配置 # base ...

  5. jQueryUI Draggable 和 Droppable 配合使用时遇到的两个坑

    jQueryUI 的 拖拽插件极大的方便了开发者对拖拽功能的实现,但是官方教程给的太笼统,在具体实现的时候很多地方不明确,这里说一下我遇到的两个 "小坑": 1:Draggable ...

  6. redis主从遇到的两个坑

    最近在使用redis主从的时候做了下面两件事情: 1 希望redis主从从操作上分析,所有写操作都在master上写,所有读操作都在从上读. 2 由于redis的从是放在本地的,所以有的key的读写操 ...

  7. 记一次uboot升级过程的两个坑

    背景 之前做过一次uboot的升级,当时留下了一些记录,本文摘录其中比较有意思的两个问题. 启动失败问题 问题简述 uboot代码中用到了一个库,考虑到库本身跟uboot版本没什么关系,就直接把旧的库 ...

  8. Hive改表结构的两个坑|避坑指南

    Hive在大数据中可能是数据工程师使用的最多的组件,常见的数据仓库一般都是基于Hive搭建的,在使用Hive时候,遇到了两个奇怪的现象,今天给大家聊一下,以后遇到此类问题知道如何避坑! 坑一:改变字段 ...

  9. 使用NSTimer过程中最大的两个坑

    坑1. retain cycle问题. 在一个对象中使用循环执行的nstimer时,若希望在对象的dealloc方法中释放这个nstimer,结局会让你很失望. 这个timer会导致你的对象根本不会被 ...

随机推荐

  1. POJ 3155 Hard Life(最大密度子图)

    裸题.输入一个无向图,输出最大密度子图(输出子图结点数和升序编号). 看了<最小割模型在信息学竞赛中的应用——胡伯涛>的一部分,感觉01分数规划问题又是个大坑.暂时还看不懂. 参考http ...

  2. .NET 接口

    接口      接口是一组抽象成员的集合,表示某个类或结构可以选择去实现的行为,描述的是可属于任何类或结构的一组相关功能.接口方法的实现是在实现接口的类中完成的,实现接口的类可以显式实现该接口的成员, ...

  3. 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)

    我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...

  4. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  5. python--基础学习(五)参数位置传递、关键字传递、包裹传递及解包裹

    python系列均基于python3.4环境 1.位置传递和关键字传递 代码示例 #位置传递 def fun(a,b,c): print("a: {0}, b: {1}, c: {2}&qu ...

  6. 去掉移动端页面 input, textarea, button, a 标签获取焦点时显示的黑影

    input, textarea, button, a{ -webkit-tap-highlight-color:rgba(0,0,0,0); }

  7. Python学习笔记(一)——环境搭建

    一.安装包下载: 国内镜像:32位:http://pan.baidu.com/s/1jI4q4lS        64位:http://pan.baidu.com/s/1eRPhpRW 版本更迭速度很 ...

  8. C#delegate委托

    类似函数,却没有语句体. using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  9. 虚拟机(VMware12 pro)安装Mac OS 10.10

    下载VMware12pro,Mac OS 10.10.ios,虚拟机破解: 在虚拟机中创建新虚拟机://http://cdnnn.07net01.com/linux/2016/01/1130384.h ...

  10. php 执行计划任务方式之 linux crontab 执行命令

    一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动c ...