五年半前旧文重贴:FREEBSD内核开发者指控LINUX非法剽窃源代码

FREEBSD内核开发者指控LINUX非法剽窃源代码

Soren   Schmidt   是FREEBSD核心开发人员之一,他现在是“the   author   and   maintainer   of   the   FreeBSD   ATA   driver   subsystem   (disk,   CDROM,   DVD,   ZIP,   LS120   etc)”,FREEBSD内核源代码   ata-raid.h   就是由他负责开发与维护的。 

当他浏览   linux   kernel   source   2.4.10   ATA部分时,忽然发现,竟然linux源代码与他写的是那么相似——太相似了。 
Soren   Schmidt   说:“他们(linux   核心开发者)仅仅把我代码中的版权声明给拿掉,This   is   clearest   with   the   two   header   files   hptraid.h   and   pdcraid.h.   Compare   these   with   FreeBSD 's   ata-raid.h,   and   just   look   at   the   similarities,太相似了,其中   reading   of   the   RAID   config   from   the   disks   的代码倒是他们自己写的,但是很明显许多灵感都是来自我们的,看看头文件,他们仅仅做了个chop   up,而头文件中的结构就已经是the   whole   story了”。 

ata-raid.h   与其他相关文件是有BSD版权的,但是明显linux开发者非法剽窃了这些代码。 

读者可以在http://bsdnews.com/view_story.php3?story_id=2416   与http://bsd.slashdot.org/article.pl?sid=01/09/24/1432223&mode=thread看到英文报道如下: 
Soren   Schmidt   was   browsing   through   the   2.4.10   linux   kernel   source   when   he   saw   something   that   looked   a   bit   familiar.   Too   familiar   in   fact.   S?ren   is   the   principle   developer   of   FreeBSD 's   ATA   drivers,   including   FreeBSD 's   support   for   ATA   RAID   cards,   and   as   he   looked   through   the   linux/drivers/ide/   files   the   sense   of   deja   vu   was   overwhelming.   Read   on   for   more.   
"They   just   took   my   code   and   filed   off   the   copyright "   said   S?ren.   "This   is   clearest   with   the   two   header   files   hptraid.h   and   pdcraid.h.   Compare   these   with   FreeBSD 's   ata-raid.h,   and   just   look   at   the   similarities. "   And   it 's   true   that   these   two   header   files   certainly   look   like   a   chopped   up   copy   of   the   FreeBSD   header,   after   a   quick   search-and-replace.   "The   reading   of   the   RAID   config   from   the   disks   is   their   own   code,   but   is   clearly   "inspired "   from   our   code, "   said   S?ren,   "but   that 's   encouraged   by   the   license.   It 's   the   verbatim   use   of   the   other   code   without   retaining   the   copyright   that 's   the   problem. "   

ata-raid.h,   and   the   other   files,   are   copyright   S?ren,   and   released   under   the   three   clause   BSD   license,   which   includes   the   restriction   "Redistributions   of   source   code   must   retain   the   above   copyright   notice ".   So   using   these   files,   or   significant   portions   of   them,   in   your   own   code,   without   retaining   the   copyright   information,   as   has   happened   here,   is   prohibited. 

You   may   be   thinking   "This   is   only   a   couple   of   header   files,   what 's   the   big   deal? ".   As   S?ren   says   "The   problem   here   is   that   the   structures   in   the   headers   is   the   whole   story.   That   info   tells   how   you   read   the   proprietary   struct   off   the   disks,   and   was   reverse   engineered   and   documented   by   me   after   a   lot   of   effort. "   S?ren 's   intellectual   property   is   tied   up   in   those   files. 

Right   now,   S?ren   is   in   discussions   with   the   authors   of   the   Linux   ATA   drivers   (employed   by   RedHat)   to   ensure   that   his   copyright   notice   is   returned   to   these   and   other   files,   and   to   ensure   that   this   situation   does   not   recur.   And   it   is   hoped   that   an   amicable   solution   can   be   reached. 


Babak   Farrokhi(babak@farrokhi.net)称LINUX的这种行为是代码劫持(Code   hijacking),说:“Does   GNU   copyleft   allow   stealing   code   and   removing   it 's   copyright   notice?   Is   this   really   legal?   And   what   REDHAT   have   to   say   about   this?   ”(是不是GNU   copyleft   允许偷代码,然后把版权声明remove了呢?这是真的合法的吗?) 

marc   rassbach   说:“It   is   not   the   1st   time   this   kind   of   'technology   transfer '   has   happened   ”,(这不是第一次了),“If   you   go   digging   back   in   time   RedHat   Pre   7.0   used   BSD 's   lpr.   The   man   pages   point   out   lp()   was   from   BSD,   but   little   RedHat   Advertising   said   'Portions   copyright   University   of   Berkley '.   And   2.0.16   kernel   (I 'd   have   to   go   look....it   has   been   mentioned   here   on   daemonnews)   has   headder   files   where   they   point   out   they   TOOK   the   code   from   BSD,   yet   remmoved   the   copyright.   Glad   this   was   reported!   Kudos   to   Mr.   Schmidt   for   enforcing   his   rights!” 


为了读者便于对照阅读,特将FREEBSD与LINUX中的这几个头文件复制如下: 

FREEBSD: 
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/ata-raid.h?rev=1.5&content-type=text/x-cvsweb-markup 
/*- 
  *   Copyright   (c)   2000,2001   S鴕en   Schmidt   <sos@FreeBSD.org> 
  *   All   rights   reserved. 
  * 
  *   Redistribution   and   use   in   source   and   binary   forms,   with   or   without 
  *   modification,   are   permitted   provided   that   the   following   conditions 
  *   are   met: 
  *   1.   Redistributions   of   source   code   must   retain   the   above   copyright 
  *         notice,   this   list   of   conditions   and   the   following   disclaimer, 
  *         without   modification,   immediately   at   the   beginning   of   the   file. 
  *   2.   Redistributions   in   binary   form   must   reproduce   the   above   copyright 
  *         notice,   this   list   of   conditions   and   the   following   disclaimer   in   the 
  *         documentation   and/or   other   materials   provided   with   the   distribution. 
  *   3.   The   name   of   the   author   may   not   be   used   to   endorse   or   promote   products 
  *         derived   from   this   software   without   specific   prior   written   permission. 
  * 
  *   THIS   SOFTWARE   IS   PROVIDED   BY   THE   AUTHOR   ``AS   IS ' '   AND   ANY   EXPRESS   OR 
  *   IMPLIED   WARRANTIES,   INCLUDING,   BUT   NOT   LIMITED   TO,   THE   IMPLIED   WARRANTIES 
  *   OF   MERCHANTABILITY   AND   FITNESS   FOR   A   PARTICULAR   PURPOSE   ARE   DISCLAIMED. 
  *   IN   NO   EVENT   SHALL   THE   AUTHOR   BE   LIABLE   FOR   ANY   DIRECT,   INDIRECT, 
  *   INCIDENTAL,   SPECIAL,   EXEMPLARY,   OR   CONSEQUENTIAL   DAMAGES   (INCLUDING,   BUT 
  *   NOT   LIMITED   TO,   PROCUREMENT   OF   SUBSTITUTE   GOODS   OR   SERVICES;   LOSS   OF   USE, 
  *   DATA,   OR   PROFITS;   OR   BUSINESS   INTERRUPTION)   HOWEVER   CAUSED   AND   ON   ANY 
  *   THEORY   OF   LIABILITY,   WHETHER   IN   CONTRACT,   STRICT   LIABILITY,   OR   TORT 
  *   (INCLUDING   NEGLIGENCE   OR   OTHERWISE)   ARISING   IN   ANY   WAY   OUT   OF   THE   USE   OF
  *   THIS   SOFTWARE,   EVEN   IF   ADVISED   OF   THE   POSSIBILITY   OF   SUCH   DAMAGE. 
  * 
  *   $FreeBSD:   /repoman/r/ncvs/src/sys/dev/ata/ata-raid.h,v   1.5   2001/09/20   15:25:34   sos   Exp   $ 
  */ 

struct   ar_softc   { 
        int   lun; 
        int32_t   magic_0; 
        int32_t   magic_1; 
        int   flags; 
#define   AR_F_RAID_0   0x0001     /*   STRIPE   */ 
#define   AR_F_RAID_1   0x0002     /*   MIRROR   */ 
#define   AR_F_SPAN   0x0004     /*   SPAN   */ 
#define   AR_F_CONF_DONE   0x0008 
        
        int   num_subdisks; 
        struct   ad_softc   *subdisk[8]; 
        int   num_mirrordisks; 
        struct   ad_softc   *mirrordisk[8]; 
        int   interleave; 
        int   last_disk; 
        int32_t   last_lba[8][2]; 

        u_int16_t   heads; 
        u_int16_t   sectors; 
        u_int32_t   cylinders; 
        u_int32_t   total_secs; 
        int   reserved;       /*   sectors   that   are   NOT   to   be   used   */ 
        int   offset;         /*   offset   from   start   of   disk   */ 

        struct   disk                                   disk;   /*   disklabel/slice   stuff   */ 
        dev_t                                               dev;   /*   device   place   holder   */ 

}; 

struct   ar_buf   { 
        struct   bio   bp; 
        struct   bio   *org; 
        int   drive; 
        struct   ar_buf   *mirror; 
        int   done; 
}; 

struct   highpoint_raid_conf   { 
        int8_t     filler1[32]; 
        u_int32_t     magic;       /*   0x20   */ 
#define   HPT_MAGIC_OK     0x5a7816f0 
#define   HPT_MAGIC_BAD     0x5a7816fd 

        u_int32_t     magic_0; 
        u_int32_t     magic_1; 
        u_int32_t     order; 
#define   HPT_O_MIRROR     0x01 
#define   HPT_O_STRIPE     0x02 
#define   HPT_O_OK     0x04 

        u_int8_t     raid_disks; 
        u_int8_t     raid0_shift; 
        u_int8_t     type; 
#define   HPT_T_RAID_0     0x00 
#define   HPT_T_RAID_1     0x01 
#define   HPT_T_RAID_01_RAID_0   0x02 
#define   HPT_T_SPAN     0x03 
#define   HPT_T_RAID_3     0x04 
#define   HPT_T_RAID_5     0x05 
#define   HPT_T_SINGLEDISK   0x06 
#define   HPT_T_RAID_01_RAID_1   0x07 

        u_int8_t     disk_number; 
        u_int32_t     total_secs; 
        u_int32_t     disk_mode; 
        u_int32_t     boot_mode; 
        u_int8_t     boot_disk; 
        u_int8_t     boot_protect; 
        u_int8_t     error_log_entries; 
        u_int8_t     error_log_index; 
        struct   { 
  u_int32_t   timestamp; 
  u_int8_t   reason; 
#define   HPT_R_REMOVED     0xfe 

#define   HPT_R_BROKEN     0xff 



  u_int8_t   disk; 
  u_int8_t   status; 
  u_int8_t   sectors; 
  u_int32_t   lba; 
        }   errorlog[32]; 
        int8_t     filler2[60]; 
}; 

struct   promise_raid_conf   { 
        char     promise_id[24]; 
#define   PR_MAGIC   "Promise   Technology,   Inc. " 

        int32_t     dummy_0; 
        int32_t     magic_0; 
        int32_t     dummy_1; 
        int32_t     magic_1; 
        int16_t     dummy_2; 
        int8_t     filler1[470]; 
        struct   { 
  int32_t   flags;         /*   0x200   */ 
#define   PR_F_CONFED     0x00000080 

  int8_t     dummy_0; 
  int8_t     disk_number; 
  int8_t     channel; 
  int8_t     device; 
  int32_t     magic_0; 
  int32_t     dummy_1; 
  int32_t     dummy_2;     /*   0x210   */ 
  int32_t     disk_secs; 
  int32_t     dummy_3; 
  int16_t     dummy_4; 
  int8_t     status; 
#define   PR_S_DEFINED     0x01 
#define   PR_S_ONLINE     0x02 
#define   PR_S_OFFLINE     0x10 

  int8_t     type; 
#define   PR_T_STRIPE     0x00 
#define   PR_T_MIRROR     0x01 
#define   PR_T_STRIPE_MIRROR   0x04 
#define   PR_T_SPAN     0x08 

  u_int8_t   total_disks;     /*   0x220   */ 
  u_int8_t   raid0_shift; 
  u_int8_t   raid0_disks; 
  u_int8_t   array_number; 
  u_int32_t   total_secs; 
  u_int16_t   cylinders; 
  u_int8_t   heads; 
  u_int8_t   sectors; 
  int32_t     magic_1; 
  int32_t     dummy_5;     /*   0x230   */ 
  struct   { 
          int16_t   dummy_0; 
          int8_t   channel; 
          int8_t   device; 
          int32_t   magic_0; 
          int32_t   disk_number; 
  }   disk[8]; 
        }   raid; 
        int32_t     filler2[346]; 
        uint32_t     checksum; 
}; 

int   ar_probe(struct   ad_softc   *); 

  

LINUX: 

"hptraid.h ": 
struct   highpoint_raid_conf 

              int8_t     filler1[32]; 
              u_int32_t               magic; 
#define   HPT_MAGIC_OK       0x5a7816f0 
#define   HPT_MAGIC_BAD     0x5a7816fd     

              u_int32_t               magic_0; 
              u_int32_t               magic_1; 
              u_int32_t               order;     
#define   HPT_O_MIRROR       0x01     
#define   HPT_O_STRIPE       0x02 
#define   HPT_O_OK               0x04 

              u_int8_t                 raid_disks; 
              u_int8_t                 raid0_shift;   
              u_int8_t                 type; 
#define   HPT_T_RAID_0       0x00   
#define   HPT_T_RAID_1       0x01 
#define   HPT_T_RAID_01_RAID_0       0x02 
#define   HPT_T_SPAN                           0x03 
#define   HPT_T_RAID_3                       0x04       
#define   HPT_T_RAID_5                       0x05 
#define   HPT_T_SINGLEDISK               0x06 
#define   HPT_T_RAID_01_RAID_1       0x07 

              u_int8_t                 disk_number; 
              u_int32_t               total_secs;   
              u_int32_t               disk_mode;     
              u_int32_t               boot_mode; 
              u_int8_t                 boot_disk;   
              u_int8_t                 boot_protect; 
              u_int8_t                 error_log_entries; 
              u_int8_t                 error_log_index;     
              struct 
              { 
                              u_int32_t               timestamp; 
                              u_int8_t                 reason;       
#define   HPT_R_REMOVED                     0xfe             
#define   HPT_R_BROKEN                       0xff             

                              u_int8_t                 disk; 
                              u_int8_t                 status; 
                              u_int8_t                 sectors; 
                              u_int32_t               lba; 
              }   errorlog[32]; 
              u_int8_t                 filler[60]; 
}; 


"pdcraid.h ": 
struct   promise_raid_conf   { 
        char                                 promise_id[24]; 

        u32                           dummy_0; 
        u32                           magic_0; 
        u32                           dummy_1; 
        u32                           magic_1; 
        u16                           dummy_2; 
        u8                             filler1[470]; 
        struct   { 
                u32   flags;                                                     /*   0x200   */ 
                u8                     dummy_0; 
                u8                     disk_number; 
                u8                     channel; 
                u8                     device; 
                u32                   magic_0; 
                u32                   dummy_1; 
                u32                   dummy_2;                                 /*   0x210   */ 
                u32                   disk_secs; 
                u32                   dummy_3; 
                u16                   dummy_4; 
                u8                     status; 
                u8                     type; 
                u8                 total_disks;                         /*   0x220   */ 
                u8                 raid0_shift; 
                u8                 raid0_disks; 
                u8                 array_number; 
                u32               total_secs; 
                u16               cylinders; 
                u8                 heads; 
                u8                 sectors; 
                u32                   magic_1; 
                u32                   dummy_5;                                 /*   0x230   */ 
                struct   { 
                        u16           dummy_0; 
                        u8             channel; 
                        u8             device; 
                        u32           magic_0; 
                        u32           disk_number; 
                }   disk[8]; 
        }   raid; 
        u32                           filler2[346]; 
        u32                         checksum; 
}; 

#define   PR_MAGIC                 "Promise   Technology,   Inc. " 


我们还应该知道的是,Soren   Schmidt   指控剽窃的时间是在2001年9月,但是5年过去了,此事仍然没有结局,在2003年GNU社区采用DDOS攻击与死亡恐吓信等恐怖与流氓手段威胁SCO高层管理人员时,Soren   Schmidt   本人尽管与SCO无关,但因为他的这个质疑,也受到了几次威胁,让人们不得不质疑GNU社区本身是不是黑社会。 

我们还可以看到,LINUX内核开发者的剽窃手段是远远高于麒麟OS开发者的。麒麟OS开发者如果好好向LINUX内核开发者学习剽窃手段,就不会被国人耻笑了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值