Giter VIP home page Giter VIP logo

ntfs-3g's People

Contributors

antonaltaparmakov avatar cwhuang avatar jpandre avatar orempel avatar szakacsits avatar thesamesam avatar unsound avatar yura-pakhuchiy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ntfs-3g's Issues

RFE: port to `fuse3`

fuse 2.x is no longer maintained and looks like ntfs-3g is praobably last ptrojest which still not has been ported to fuse3.

Compiling on macOS BigSur

Hi I'm trying to compile tuxera's ntfs-3g by myself because homebrew has blocked all packages requiring FUSE.

So I tried these commands: git clone https://github.com/tuxera/ntfs-3g.git ./autogen.sh ./configure make

but when running make it begins to compile but at the end it reports that: Undefined symbols for architecture x86_64: "_libintl_setlocale", referenced from: _utils_set_locale in utils.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[2]: *** [ntfsfix] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2

How can I solve that?

Heap overflow in ntfsck

Hello.

I have found a vulnerability in the NTFS-3G driver, specifically in the ntfsck tool (see: ntfsprogs/ntfsck.c).

In the check_file_record function, the update sequence array is applied, but no proper boundary checks are implemented, so the function can write bytes from the update sequence array beyond the buffer being checked.

The vulnerable code is here:

usa_ofs = le16_to_cpu(mft_rec->usa_ofs);
usa_count = le16_to_cpu(mft_rec->usa_count);

[...]

// Remove update seq & check it.
usa = *(u16*)(buffer+usa_ofs); // The value that should be at the end of every sector.
assert_u32_equal(usa_count-1, buflen/NTFS_BLOCK_SIZE, "USA length");
for (i=1;i<usa_count;i++) {
    u16 *fixup = (u16*)(buffer+NTFS_BLOCK_SIZE*i-2); // the value at the end of the sector.
    u16 saved_val = *(u16*)(buffer+usa_ofs+2*i); // the actual data value that was saved in the us array.

    assert_u32_equal(*fixup, usa, "fixup");
    *fixup = saved_val; // remove it.
}

If buflen is 1024, but the update sequence array contains 4 entries (including the first one, which you call usa), the loop will replace bytes 3 times, at the following offsets: buffer+512*1−2 (within the buffer), buffer+512*2−2 (within the buffer), buffer+512*3−2 (beyond the allocated buffer size). (The offset of the first attribute should be set to make room for additional entries in the update sequence array, so the usa_ofs+usa_count <= attrs_offset check is passed.)

Thus, bytes beyond the allocated buffer can be replaced, this is a heap overflow.

It should be noted that the assert_u32_equal function just reports the errors, it doesn’t terminate the execution flow.

Since the ntfsck tool is used in some GNU/Linux distributions (it’s fsck.ntfs in Fedora), I strongly suggest implementing a fix.


Report date (to info at tuxera dot com): 2021-09-24. No reply.
Ping (to info at tuxera dot com): 2021-09-29. No reply.

--sbindir ignored

even though --sbindir=/bin is passed, mount.ntfs3g is being installed into /sbin nonetheless.

Mounting in read-only mode allows access times to be changed

Problem description: When mounting an NTFS filesystem in read-only (ro) mode using the mount command, accessing a file still updates its access time.

Why is this a problem? Other filesystems (such as ext4) do not modify file access times when mounted read-only.

I feel it worth mentioning that when using "ntfs-3g -o ro /dev/device mount-point" to mount NTFS,file access times are not updated. File access times are only updated when mounting the NTFS volume using "mount -o ro /dev/device mount-point".

Steps to reproduce:

dd if=/dev/zero of=ntfs.img count=102400
mkfs.ntfs --force ntfs.img
mkdir disk
mount.ntfs-3g ntfs.img disk
cp somefile.txt disk/
umount disk

mount -o ro ntfs.img disk
stat disk/somefile.txt
(shows access time)
sleep 60
cat disk/somefile.txt
stat disk/somefile.txt
(shows updated access time)

Note: When mounting ntfs.img using "ntfs-3g -o ro ntfs.img disk" the file access times are not changed.

When this same test is doen with ext4, file access times do not change.

Test system: Debian 11, running kernel 5.10

Running mount.ntfs-3g --version gives the following information:
"ntfs-3g 2017.3.23AR.3 integrated FUSE 28"

Additional discussion on this issue is happening in this Reddit thread: https://old.reddit.com/r/linux/comments/vhpdp3/mount_o_ro_does_not_writeprotect_last_access/

Do you send TRIM?

Hi and thanks a lot for ntfs-3g!

When formatting an SSD, does ntfs-3g send the ATA TRIM command?

Back in 2021, Jean-Pierre André kindly answered this:

Not currently, but you can use fstrim(8) afterwards for trimming the unused sectors of a SSD.

I wonder if that's still true with ntfs-3g version 2022.5.17.

The code in ioctl.c indicates that ntfs-3g can send ioctl(dev, BLKDISCARD, range).

Since that function also logs via ntfs_log_debug, I ran mkfs.ntfs --debug /dev/sdb2, hoping to see those log messages. I didn't, though.

Still, after formatting, TestDisk and PhotoRec weren't able to recover any files, which leads me to believe that TRIM was sent to the SSD (connected via SATA).

livelock scenario

[Environment]
22.04 5.15.0-43-generic ubuntu kernel.
ntfs-3g version ntfs-3g 2021.8.22 integrated FUSE 28 - Third Generation NTFS Driver

[Problem]
I bumped on livelock and analyze it. and concluded that it is needed to be fixed.
it happends when 3 operation concurrently progressing.

  1. usb detach by user. and kernel detect it.
  2. mount.ntfs umount request & device release operation
  3. pool-udisksd umount operation.

[Conclusion]

  1. mounted target device file must be released after /dev/fuse release. it makes deadlocky scenario.
  2. fuse file system "fuse_simple_request" should not be waiting forever. it is hard to solve this situation by interrupting application. huntask panic configuration make user kernel panic. user
    don't know why.

[Analysis]
I got a kernel crash dump file. and analyze it.

here is the scenario description.
1

  1. kworker detect usb is detached from computer.
    it is blocked by umount operation (pool-udiskd)
    PID: 8 TASK: ffff88810029e400 CPU: 0 COMMAND: "kworker/0:1"
    0 [ffffc9000006f6f0] __schedule at ffffffff81d57c0d
    1 [ffffc9000006f778] schedule at ffffffff81d57fae
    2 [ffffc9000006f798] rwsem_down_read_slowpath at ffffffff81d5a2de
    3 [ffffc9000006f830] down_read at ffffffff81d5a373 // wait s_umount
    4 [ffffc9000006f848] get_super at ffffffff813799ca
    5 [ffffc9000006f878] fsync_bdev at ffffffff815c6f46
    6 [ffffc9000006f8a0] delete_partition at ffffffff815e9328
    7 [ffffc9000006f8c0] blk_drop_partitions at ffffffff815e9b3e
    8 [ffffc9000006f8e8] del_gendisk at ffffffff815e75f1 // lock mutex
    9 [ffffc9000006f930] sd_remove at ffffffff818cd325
    10 [ffffc9000006f958] __device_release_driver at ffffffff8184006f
    11 [ffffc9000006f990] device_release_driver at ffffffff818400a9
    12 [ffffc9000006f9b0] bus_remove_device at ffffffff8183f28e
    13 [ffffc9000006f9d8] device_del at ffffffff818399ac
    14 [ffffc9000006fa28] __scsi_remove_device at ffffffff818c2628
    15 [ffffc9000006fa50] scsi_forget_host at ffffffff818c029f
    16 [ffffc9000006fa70] scsi_remove_host at ffffffff818b3727
    17 [ffffc9000006fa98] usb_stor_disconnect at ffffffffc0659b20 [usb_storage]
    18 [ffffc9000006fac0] usb_unbind_interface at ffffffff8194ef30
    19 [ffffc9000006fb18] __device_release_driver at ffffffff8184006f
    20 [ffffc9000006fb50] device_release_driver at ffffffff818400a9
    21 [ffffc9000006fb70] bus_remove_device at ffffffff8183f28e
    22 [ffffc9000006fb98] device_del at ffffffff818399ac
    23 [ffffc9000006fbe8] usb_disable_device at ffffffff8194cdce
    24 [ffffc9000006fc30] usb_disconnect.cold at ffffffff81d19e09
    25 [ffffc9000006fc80] hub_port_connect at ffffffff81944bb8
    26 [ffffc9000006fd00] hub_port_connect_change at ffffffff819454b1
    27 [ffffc9000006fd70] port_event at ffffffff81945d77
    28 [ffffc9000006fe08] hub_event at ffffffff819460a7
    29 [ffffc9000006fe78] process_one_work at ffffffff810d9e7b
    30 [ffffc9000006fec8] worker_thread at ffffffff810da073
    31 [ffffc9000006ff10] kthread at ffffffff810e1cba
    32 [ffffc9000006ff50] ret_from_fork at ffffffff81004bc2

3 [ffffc9000006f830] down_read at ffffffff81d5a373
ffffc9000006f838: [ffff888154d36800:kmalloc-2k] ffffc9000006f870
ffffc9000006f848: get_super+154

  1. it request umount. and release /dev/sdc file before release /dev/fuse. but. it is blocked by usb detach.
    PID: 18681 TASK: ffff88810e5b8000 CPU: 1 COMMAND: "mount.ntfs"
    0 [ffffc90000ea7c50] __schedule at ffffffff81d57c0d
    1 [ffffc90000ea7cd8] schedule at ffffffff81d57fae
    2 [ffffc90000ea7cf8] schedule_preempt_disabled at ffffffff81d5839e
    3 [ffffc90000ea7d08] __mutex_lock.constprop.0 at ffffffff81d59053
    4 [ffffc90000ea7d80] __mutex_lock_slowpath at ffffffff81d59353
    5 [ffffc90000ea7d90] mutex_lock at ffffffff81d59394 // wait open mutex
    6 [ffffc90000ea7da8] blkdev_put at ffffffff815c765a
    7 [ffffc90000ea7de0] blkdev_close at ffffffff815c86e7
    8 [ffffc90000ea7df8] __fput at ffffffff8137704f
    9 [ffffc90000ea7e30] ____fput at ffffffff8137724e
    10 [ffffc90000ea7e40] task_work_run at ffffffff810deb6d
    11 [ffffc90000ea7e68] exit_to_user_mode_loop at ffffffff81160fc0
    12 [ffffc90000ea7e90] exit_to_user_mode_prepare at ffffffff8116106c
    13 [ffffc90000ea7ea8] syscall_exit_to_user_mode at ffffffff81d4f327
    14 [ffffc90000ea7ec0] do_syscall_64 at ffffffff81d4b1b9
    15 [ffffc90000ea7ef8] exit_to_user_mode_prepare at ffffffff81161007
    16 [ffffc90000ea7f10] syscall_exit_to_user_mode at ffffffff81d4f327
    17 [ffffc90000ea7f28] do_syscall_64 at ffffffff81d4b1b9
    RIP: 00007f3e315fb117 RSP: 00007fff16bcb628 RFLAGS: 00000246
    RAX: 0000000000000000 RBX: 000055cc1b45c710 RCX: 00007f3e315fb117
    RDX: 0000000000000000 RSI: 0000000000000006 RDI: 0000000000000003
    RBP: 000055cc1b45c970 R8: 000055cc1b476940 R9: 0000000000000000
    R10: 0000000000000005 R11: 0000000000000246 R12: 00007f3e314e36c0
    R13: 000055cc1b45c710 R14: 000055cc1b467030 R15: 00000000ffffffff
    ORIG_RAX: 0000000000000003 CS: 0033 SS: 002b

3 [ffffc90000ea7d08] __mutex_lock.constprop.0 at ffffffff81d59053
ffffc90000ea7d10: [ffff8881caad1880:kmalloc-512] 00000002547b2ff8
ffffc90000ea7d20: [ffff8881caad1880:kmalloc-512] [ffff8881caad1880:kmalloc-512]
ffffc90000ea7d30: [ffff88810e5b8000:task_struct] 0000000008000008
ffffc90000ea7d40: ffffc90000ea7de0 fcee7cb500545100
ffffc90000ea7d50: [ffff888110f99f40:bdev_cache] [ffff8881caad1870:kmalloc-512]
ffffc90000ea7d60: [ffff8881caad1800:kmalloc-512] [ffff8881caad1870:kmalloc-512]
ffffc90000ea7d70: [ffff8881bcd4ccc0:dentry] ffffc90000ea7d88
ffffc90000ea7d80: __mutex_lock_slowpath+19
4 [ffffc90000ea7d80] __mutex_lock_slowpath at ffffff

  1. we can know that it is releasing /dev/sdc file and not release /dev/fuse.
    crash> files 18681
    PID: 18681 TASK: ffff88810e5b8000 CPU: 1 COMMAND: "mount.ntfs"
    ROOT: / CWD: /
    FD FILE DENTRY INODE TYPE PATH
    0 ffff888102f75200 ffff8881020510c0 ffff888100f84668 CHR /dev/null
    1 ffff888102f75200 ffff8881020510c0 ffff888100f84668 CHR /dev/null
    2 ffff888102f75200 ffff8881020510c0 ffff888100f84668 CHR /dev/null
    4 ffff888154001f00 ffff8881020cce40 ffff888100f90f50 CHR /dev/fuse
    5 ffff888102f74200 ffff8881c2c5dd80 ffff88815db73e40 SOCK UNIX
    8 ffff888106412800 ffff888104785540 ffff888104a9e470 REG /proc/804/mountinfo
    9 ffff888106412100 ffff888100443840 ffff8881022a9688 REG /proc/swaps
    14 ffff88810a720700 ffff888104785540 ffff888104a9e470 REG /proc/804/mountinfo

  2. pool udisksd is progressing umount process (cuz uhelper=udisksd2)
    but it is waiting forever cuz mount.ntfs does not progress. (if it is to be released, /dev/fuse
    must be released. but mount.ntfs blocked by kworker)

PI3: 18741 TASK: ffff8881a702b200 CPU: 1 COMMAND: "pool-udisksd"
0 [ffffc900022a3be8] __schedule at ffffffff81d57c0d
1 [ffffc900022a3c70] schedule at ffffffff81d57fae
2 [ffffc900022a3c90] request_wait_answer at ffffffff814ea190
3 [ffffc900022a3cf0] fuse_simple_request at ffffffff814ec9c1
4 [ffffc900022a3d30] fuse_send_destroy at ffffffff814f743f
5 [ffffc900022a3db8] fuse_conn_destroy at ffffffff814f7622
6 [ffffc900022a3dd0] fuse_kill_sb_blk at ffffffff814f7d82
7 [ffffc900022a3e00] deactivate_locked_super at ffffffff8137863b
8 [ffffc900022a3e20] deactivate_super at ffffffff813786f0 // lock s_umount
9 [ffffc900022a3e38] cleanup_mnt at ffffffff8139f350
10 [ffffc900022a3e78] __cleanup_mnt at ffffffff8139f422
11 [ffffc900022a3e88] task_work_run at ffffffff810deb6d
12 [ffffc900022a3eb0] exit_to_user_mode_loop at ffffffff81160fc0
13 [ffffc900022a3ed8] exit_to_user_mode_prepare at ffffffff8116106c
14 [ffffc900022a3ef0] syscall_exit_to_user_mode at ffffffff81d4f327
15 [ffffc900022a3f08] do_syscall_64 at ffffffff81d4b1b9
16 [ffffc900022a3f50] entry_SYSCALL_64_after_hwframe at ffffffff81e0007c
RIP: 00007f110d17bbeb RSP: 00007f110beb63b8 RFLAGS: 00000246
RAX: 0000000000000000 RBX: 00007f10fc0257e0 RCX: 00007f110d17bbeb
RDX: 0000000000000000 RSI: 0000000000000000 RDI: 00007f10fc012bb0
RBP: 00007f10fc09f480 R8: 0000000000000000 R9: 00007f10fc05edf0
R10: 00007f10fc05ee30 R11: 0000000000000246 R12: 0000000000000000
R13: 00007f10fc012bb0 R14: 00007f10fc09f590 R15: 0000000000000000
ORIG_RAX: 00000000000000a6 CS: 0033 SS: 002b

"not in multiple of 0x10000" disk scan errors for sparse files

In Ubuntu 21.10 using ntfs-3g 1:2017.3.23AR.3-3ubuntu5 I can create sparse files which result in the following messages from Windows 10 21H2 disk scanning:

Stage 1: Examining basic file system structure ...
The allocated length 0x41000 is not in multiple of 0x10000 for attribute
of type 0x80 and instance tag 0x1.

The Windows GUI will say that the drive was scanned successfully with no errors, and I will need to look in Event Viewer to see this in scanning output. Repeated scans will not do anything about this issue. To fix the issue, make a copy of the affected file in Windows and delete the original.

Attribute of type 0x80 is the data attribute, which tells where the file's data is stored. Apparently Windows allocates space for sparse files in multiples of 64 KB (0x10000), and ntfs-3g does not. The message from disk scanning in Windows fails to tell you what file is involved. I only found the affected file after seeing that sparse files use 64 KB chunks, and then searching the file system for sparse files.

I'm attaching a tar file created with the --sparse option. Extracting it onto NTFS should create a sparse file which triggers this issue. I'm testing with a partition with 4 KB clusters.
1229312_sparse_266240.tar.gz

After reporting the Ubuntu bug at https://bugs.launchpad.net/ubuntu/+source/ntfs-3g/+bug/1958180 I tried installing and using ntfs-3g 1:2021.8.22-3ubuntu1 in Ubuntu 21.10, and was able to reproduce the same issue, so I'm reporting it here. I hope this is the right place to report ntfs-3g bugs.

Support for Windows Bitlocker in Linux through ntfs-3g

I was transferring files to and from a bitlocker partition in linux. PC was slowing down while transferring. Does it support bitlocker fully, i.e. on the fly encryption. I have a little doubt on this.

Anyone with similar issue?

Currently I can open bitlocker partition in linux. Pls help with the issue/doubt.

Best regards

Deprecation warning in macOS Catalina

Just FYI:

compiling 2021.8.22 on macOS Catalina

gcc -DHAVE_CONFIG_H -I. -I..   -I/usr/local/include  -DFUSE_USE_VERSION=26 -D_FILE_OFFSET_BITS=64 -D_DARWIN_USE_64_BIT_INODE -I/usr/local/include/osxfuse/fuse -I../include/ntfs-3g -DPLUGIN_DIR=\"/usr/local/lib/ntfs-3g\" -arch x86_64 -Os -Wall -c -o lowntfs_3g-ntfs-3g_common.o `test -f 'ntfs-3g_common.c' || echo './'`ntfs-3g_common.c
ntfs-3g.c:4301:7: warning: 'daemon' is deprecated: first deprecated in macOS
      10.5 - Use posix_spawn APIs instead. [-Wdeprecated-declarations]
                if (daemon(0, ctx->debug))
                    ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:292:6:gcc -DHAVE_CONFIG_H -I. -I..   -I/usr/local/include  -DFUSE_USE_VERSION=26 -D_FILE_OFFSET_BITS=64 -D_DARWIN_USE_64_BIT_INODE -I/usr/local/include/osxfuse/fuse -I../include/ntfs-3g -DPLUGIN_DIR=\"/usr/local/lib/ntfs-3g\" -arch x86_64 -Os -Wall -c -o lowntfs_3g-ntfs-3g_common.o `test -f 'ntfs-3g_common.c' || echo './'`ntfs-3g_common.c
ntfs-3g.c:4301:7: warning: 'daemon' is deprecated: first deprecated in macOS
      10.5 - Use posix_spawn APIs instead. [-Wdeprecated-declarations]
                if (daemon(0, ctx->debug))
                    ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdlib.h:292:6:

Where does UltraDefrag beta test (udefrag) development go?

https://web.archive.org/web/20210830161447/https://jp-andre.pagesperso-orange.fr/advanced-ntfs-3g.html
According to way back machine, the download link for the Ultra Defrag is still available.
But, will the development be continued or we just stuck with ultradefrag-5.0.0AB.8.zip?

I couldn't find any description available on the google, github or tuxera on where the development go. It just suddenly vanished between 30th August 2021 and 13th October 2021. This development is the only and currently reliable ntfs defragment port/software in unix/unix-like system that I know and valued so much.

OneDrive: unsupported reparse tag 0x9000701a

I have a drive with an NTFS partition that OneDrive on Windows 10 is configured to sync to (I've tagged the whole onedrive folder with "keep offline" so everything is downloaded locally). However, when I use the latest version of ntfs-3g (2022.5.17) the folder shows up as a broken symlink, with the target listed as

unsupported reparse tag 0x9000701a

I also tried mounting the drive with the old version of ntfs-3g included with the distro (2017.3.23AR.3-3ubuntu1.2) and while that allowed me to see the contents of the folder, all files were broken links with

unsupported reparse point

I tried running ntfsinfo and got this debug information:

> sudo ntfsprogs/ntfsinfo --file "folder/OneDrive (synced)/OneDrive - [my organization]" /dev/sdb1
Dumping Inode 242195 (0x3b213)
Upd. Seq. Array Off.:	 48 (0x30)
Upd. Seq. Array Count:	 3 (0x3)
Upd. Seq. Number:	 43 (0x2b)
LogFile Seq. Number:	 0x4117129b
MFT Record Seq. Numb.:	 5 (0x5)
Number of Hard Links:	 2 (0x2)
Attribute Offset:	 56 (0x38)
MFT Record Flags:	 IN_USE DIRECTORY 
Bytes Used:		 712 (0x2c8) bytes
Bytes Allocated:	 1024 (0x400) bytes
Next Attribute Instance: 28 (0x1c)
MFT Padding:	00 00 
Dumping attribute $STANDARD_INFORMATION (0x10) from mft record 242195 (0x3b213)
	Resident: 		 Yes
	Attribute flags:	 0x0000
	Attribute instance:	 0 (0x0)
	Data size:		 72 (0x48)
	Resident flags:		 0x00
	File Creation Time:	 Tue Jun 28 00:19:56 2022 UTC
	File Altered Time:	 Wed Jun 29 04:17:41 2022 UTC
	MFT Changed Time:	 Wed Jun 29 04:17:41 2022 UTC
	Last Accessed Time:	 Wed Jun 29 07:01:07 2022 UTC
	File attributes:	 READONLY ARCHIVE REPARSE_POINT UNKNOWN: 0x00080000 (0x00080421)
	Maximum versions:	 0 
	Version number:		 0 
	Class ID:		 0 
	User ID:		 0 (0x0)
	Security ID:		 282 (0x11a)
	Quota charged:		 0 (0x0)
	Update Sequence Number:	 394371712 (0x1781a280)
Dumping attribute $ATTRIBUTE_LIST (0x20) from mft record 242195 (0x3b213)
	Resident: 		 No
	Attribute flags:	 0x0000
	Attribute instance:	 11 (0xb)
	Compression unit:	 0 (0x0)
	Data size:		 392 (0x188)
	Allocated size:		 4096 (0x1000)
	Initialized size:	 392 (0x188)
Dumping attribute $FILE_NAME (0x30) from mft record 242195 (0x3b213)
	Resident: 		 Yes
	Attribute flags:	 0x0000
	Attribute instance:	 3 (0x3)
	Data size:		 82 (0x52)
	Resident flags:		 0x01
	Parent directory:	 239101 (0x3a5fd)
	File Creation Time:	 Tue Jun 28 00:19:56 2022 UTC
	File Altered Time:	 Tue Jun 28 00:19:56 2022 UTC
	MFT Changed Time:	 Tue Jun 28 00:19:56 2022 UTC
	Last Accessed Time:	 Tue Jun 28 00:19:56 2022 UTC
	Allocated Size:		 0 (0x0)
	Data Size:		 0 (0x0)
	Filename Length:	 8 (0x8)
	File attributes:	 I30_INDEX (0x10000000)
	Namespace:		 DOS
	Filename:		 'ONEDRI~1'
Dumping attribute $FILE_NAME (0x30) from mft record 242204 (0x3b21c)
	Resident: 		 Yes
	Attribute flags:	 0x0000
	Attribute instance:	 0 (0x0)
	Data size:		 136 (0x88)
	Resident flags:		 0x01
	Parent directory:	 239101 (0x3a5fd)
	File Creation Time:	 Tue Jun 28 00:19:56 2022 UTC
	File Altered Time:	 Tue Jun 28 00:19:56 2022 UTC
	MFT Changed Time:	 Tue Jun 28 00:19:56 2022 UTC
	Last Accessed Time:	 Tue Jun 28 00:19:56 2022 UTC
	Allocated Size:		 0 (0x0)
	Data Size:		 0 (0x0)
	Filename Length:	 35 (0x23)
	File attributes:	 I30_INDEX (0x10000000)
	Namespace:		 Win32
	Filename:		 'OneDrive - [my organization]'
Dumping attribute $DATA (0x80) from mft record 242204 (0x3b21c)
	Resident: 		 No
	Attribute name:		 '${3D0CE612-FDEE-43f7-8ACA-957BEC0CCBA0}.SyncRootIdentity'
	Attribute flags:	 0x0000
	Attribute instance:	 1 (0x1)
	Compression unit:	 0 (0x0)
	Data size:		 272 (0x110)
	Allocated size:		 4096 (0x1000)
	Initialized size:	 272 (0x110)
Dumping attribute $INDEX_ROOT (0x90) from mft record 242195 (0x3b213)
	Resident: 		 Yes
	Attribute name:		 '$I30'
	Attribute flags:	 0x0000
	Attribute instance:	 13 (0xd)
	Data size:		 56 (0x38)
	Resident flags:		 0x00
	Indexed Attr Type:	 DIRECTORY_I30
	Collation Rule:		 1 (0x1)
	Index Block Size:	 4096 (0x1000)
	Clusters Per Block:	 1 (0x1)
	Entries Offset:		 16 (0x10)
	Index Size:		 40 (0x28)
	Allocated Size:		 40 (0x28)
	Index header flags:	 0x01
	Index entries total:	 1
Dumping attribute $INDEX_ALLOCATION (0xa0) from mft record 242195 (0x3b213)
	Resident: 		 No
	Attribute name:		 '$I30'
	Attribute flags:	 0x0000
	Attribute instance:	 9 (0x9)
	Compression unit:	 0 (0x0)
	Data size:		 32768 (0x8000)
	Allocated size:		 32768 (0x8000)
	Initialized size:	 32768 (0x8000)
	Index entries total:	 171
	INDX blocks total:	 8
Dumping attribute $BITMAP (0xb0) from mft record 242195 (0x3b213)
	Resident: 		 Yes
	Attribute name:		 '$I30'
	Attribute flags:	 0x0000
	Attribute instance:	 10 (0xa)
	Data size:		 8 (0x8)
	Resident flags:		 0x00
Dumping attribute $REPARSE_POINT (0xc0) from mft record 242195 (0x3b213)
	Resident: 		 Yes
	Attribute flags:	 0x0000
	Attribute instance:	 27 (0x1b)
	Data size:		 116 (0x74)
	Resident flags:		 0x00
	Reparse tag:		 0x9000701a (Cloud)
	Data length:		 108 (0x6c)
	Data:			 0x01006c0046655270ed47d01a6800000002000a0007000100600000000a000400...
End of inode reached

build error with musl libc

link fails trying to resolve symbols major, minor, etc.
these are macros provided by sys/sysmacros.h , which should be included from all TUs using those.

Copy NTFS files preserving all their attributes ?

Hi,

I've been looking for a way to copy NTFS directories preserving all attributes, ACLs, permissions, reparse points etc (surprisingly hard it turns out, short of cloning the whole partition).

I came across the wiki page on Extended Attributes which gives a bit of hope :
Looks like the ntfscp.c and ntfscp.sh additional tools do just that (!)

What's the status on these ?
Why are they not part of ntfs-3g ?
Looks like that would be useful to a lot of people.

(As a side-note it was really confusing intially that it has the same name as ntfs-3g's ntfscp which seem something else entirely)

Link error on macOS Catalina

Building ntfs-3g from the tag 2021.8.22 fails:

/bin/sh ../libtool  --tag=CC   --mode=link gcc  -g -O2 -Wall  -framework CoreFoundation -o ntfsfix ntfsfix.o utils.o ../libntfs-3g/libntfs-3g.la -lc
libtool: link: gcc -g -O2 -Wall -o .libs/ntfsfix ntfsfix.o utils.o  ../libntfs-3g/.libs/libntfs-3g.dylib -lc -framework CoreFoundation
Undefined symbols for architecture x86_64:
  "_libintl_setlocale", referenced from:
      _utils_set_locale in utils.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [ntfsfix] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Improve ntfs_device_size_get for file

For calculation size of device if passed file instead of device (https://github.com/tuxera/ntfs-3g/blob/edge/libntfs-3g/device.c#L599):

	/*
	 * We couldn't figure it out by using a specialized ioctl,
	 * so do binary search to find the size of the device.
	 */
	low = 0LL;
	for (high = 1024LL; !ntfs_device_offset_valid(dev, high); high <<= 1)
		low = high;
	while (low < high - 1LL) {
		const s64 mid = (low + high) / 2;
		if (!ntfs_device_offset_valid(dev, mid))
			low = mid;
		else
			high = mid;
	}
	dev->d_ops->seek(dev, 0LL, SEEK_SET);

But there is IO callback stat(https://github.com/tuxera/ntfs-3g/blob/edge/include/ntfs-3g/device.h#L113) whose contains size of file.
So we can call this callback for avoid count of random read.

NTFS allows files ending with blank/period when mounted as root but not when mounted as user

Looking into the issue rdiff-backup/rdiff-backup#579 I noticed a discrepancy in behaviour depending if a NTFS file system is mounted as root or non-root (we're talking about the same file system freshly created with sudo mkfs.ntfs /dev/sda1 on a USB stick):

$ udisksctl mount -b /dev/sda1
$ mount | grep sda1
/dev/sda1 on /run/media/myuser/5291712E0E79C514 type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096,uhelper=udisks2
$ cd /run/media/myuser/5291712E0E79C514
$ touch a
$ touch 'a '
touch: setting times of 'a ': No such file or directory
$ touch 'a.'
touch: setting times of 'a.': No such file or directory
$ ll
total 0
-rwxrwxrwx. 1 myuser myuser 0 May 26 07:44 a

vs.

$ sudo mount -t ntfs -o nosuid,nodev,uid=1000,gid=1000 /dev/sda1 /mnt  # to make sure the mount options are the same
$ mount | grep sda1
/dev/sda1 on /mnt type fuseblk (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096)
$ touch a
$ touch 'a '
$ touch 'a.'
$ ll
total 0
-rwxrwxrwx. 1 myuser myuser 0 May 26 07:47  a
-rwxrwxrwx. 1 myuser myuser 0 May 26 07:47 'a '
-rwxrwxrwx. 1 myuser myuser 0 May 26 07:47  a.

And I can't find any reason for the difference in behaviour.

Support device offset to mount

Usually NTFS volume located on device at some offset.
We can use losetup/mdconfig for map device from offset to another device and mount this device.
But there are some problems:

  1. It is new resourse, which has limited && can be leak
  2. Method of mount is not portabled
  3. Need copy data twice: for loop device and fuse

If we pass argument for device offset we can avoid such problems.

XboxApp, unknown Reparse Point

On my Ubuntu 21.10 i get an unknown reparse point when trying to copy over the XBox GamePass app.

Debug Data:

 $(which ntfs-3g) -help 2>&1 | grep ration
ntfs-3g 2017.3.23AR.3 integrated FUSE 28 - Third Generation NTFS Driver
                Configuration type 7, XATTRS are on, POSIX ACLS are on
$ file $(which ntfs-3g)
/usr/bin/ntfs-3g: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5a308473162608bad1dcca84a20f305beb130687, for GNU/Linux 3.2.0, stripped
md5sum $(which ntfs-3g)
5d457f8668cd29b59d73a0d3b1f84a67  /usr/bin/ntfs-3g
ls -ld $(strings $(which ntfs-3g) | grep ntfs-plugin | sed -e 's/ntfs-plugin.*//')
drwxr-xr-x 2 root root 4096 Apr 11 07:44 /usr/lib/x86_64-linux-gnu/ntfs-3g/

md5sum $(strings $(which ntfs-3g) | grep ntfs-plugin | sed -e 's/%08lx/*/')
1d5331d5d6bf8a79f60e0d1f87b77094  /usr/lib/x86_64-linux-gnu/ntfs-3g/ntfs-plugin-80000013.so
63a1ccbb2d16581761ea60339a5c6d26  /usr/lib/x86_64-linux-gnu/ntfs-3g/ntfs-plugin-80000017.so
49683ea4fbe555a91a9f68b60d630cde  /usr/lib/x86_64-linux-gnu/ntfs-3g/ntfs-plugin-9000001a.so

The reparse data for the binary in question is

system.ntfs_reparse_data=0x1b0000800a010000030000004d006900630072006f0073006f00660074002e00470061006d0069006e0067004100700070005f003800770065006b0079006200330064003800620062007700650000004d006900630072006f0073006f00660074002e00470061006d0069006e0067004100700070005f003800770065006b0079006200330064003800620062007700650021004d006900630072006f0073006f00660074002e00580062006f0078002e00410070007000000043003a005c00570049004e0044004f00570053005c00730079007300740065006d00330032005c00530079007300740065006d005500570050004c00610075006e0063006800650072002e00650078006500000031000000

Dedup, SystemCompression and OneDrive plugins should be available so what is this about?

configure issue on m1 Mac? please help

➜ ntfs-3g git:(edge) ./autogen.sh
Running autoreconf --verbose --install --force
autoreconf: export WARNINGS=
autoreconf: Entering directory '.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
configure.ac:337: warning: macro 'AM_PATH_LIBGCRYPT' not found in library
autoreconf: configure.ac: tracing
autoreconf: running: glibtoolize --copy --force
glibtoolize: putting auxiliary files in '.'.
glibtoolize: copying file './ltmain.sh'
glibtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
glibtoolize: copying file 'm4/libtool.m4'
glibtoolize: copying file 'm4/ltoptions.m4'
glibtoolize: copying file 'm4/ltsugar.m4'
glibtoolize: copying file 'm4/ltversion.m4'
glibtoolize: copying file 'm4/lt~obsolete.m4'
glibtoolize: Remember to add 'LT_INIT' to configure.ac.
autoreconf: configure.ac: not using Intltool
autoreconf: configure.ac: not using Gtkdoc
autoreconf: running: aclocal --force -I m4
configure.ac:337: warning: macro 'AM_PATH_LIBGCRYPT' not found in library
autoreconf: running: /opt/homebrew/Cellar/autoconf/2.71/bin/autoconf --force
configure.ac:189: warning: The macro AC_GNU_SOURCE' is obsolete. configure.ac:189: You should run autoupdate. ./lib/autoconf/specific.m4:312: AC_GNU_SOURCE is expanded from... configure.ac:189: the top level configure.ac:475: warning: The macro AC_HEADER_STDC' is obsolete.
configure.ac:475: You should run autoupdate.
./lib/autoconf/headers.m4:704: AC_HEADER_STDC is expanded from...
configure.ac:475: the top level
configure.ac:246: error: possibly undefined macro: AC_MSG_ERROR
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:337: error: possibly undefined macro: AM_PATH_LIBGCRYPT
configure.ac:342: error: possibly undefined macro: AC_MSG_WARN
autoreconf: error: /opt/homebrew/Cellar/autoconf/2.71/bin/autoconf failed with exit status: 1

bad block size calculated, blksize option ignored

ntfs-3g gets bad BlockSize and doesn't let me use the real BS

First of all, congrats 🎊 to the team for the effort into this really great tool that provides a easy way to handle NTFS filesystems 💯

Now, the problem I faced...
I have a partition of 2 MB BS, but ntfs-3g mounts it as it's the default (4KB), despite the fact that ntfsinfo (which I thought would be where it should get the value as it was ported to ntfs-3g) gives the right value Cluster Size: 2097152.

I tried to use the -o blksize=2097152 option, but i get the error: WARNING: blksize option is ignored because ntfs-3g must calculate it.

Please, could someone tell me how I can use the correct Block Size? 🥲

Lastly, I would like to say that I think in the future the behavior of using the ntfsinfo Cluster Size would improve/fix this. 👍

Editing Windows while hibernated and remove_hiberfile

The remove_hiberfile option failed to work while I was trying to mount Windows as writeable. I would be willing to look into this myself and create a possible workaround that does not require disabling fast restart in order to edit a Windows partition and keeps the changes after Windows restarts.

In order to edit my Windows partition I was forced to remove all checks of hibernation from the source code and compile myself. It would be great if there was a working command line option that could do this instead.

how to support the other character set, such as GBK

the system has support "zh_CN.gbk", and i mounted the usb disk by "mount -t ntfs-3g -o locale=zh_CN.gbk /dev/xxx /mount_path". But I still can not create gbk filename.
eg:
[root@RV1126_RV1109:/]# mount -t ntfs-3g -o locale=zh_CN.gbk /dev/sda1 /tmp/udisk/
[root@RV1126_RV1109:/]#
[root@RV1126_RV1109:/]# cd /tmp/udisk/
[root@RV1126_RV1109:/tmp/udisk]# touch 你好
touch: cannot touch ''$'\304\343\272\303': Invalid or incomplete multibyte or wide character

Ntfs-3g is using Interix mode on write even when `special_files=wsl`

My intent was to work on new files created from Linux inside the wsl1 rootfs.
But as the files have an unrelated LXATTRB attribute, ntfs-3g is using Interix mode on chmod/chown despite the special_files=wsl option being passed on the command line.

As the result the files created from mounted ntfs-3g inside the rootfs behave like files created by the Windows explorer and are not readable.

Error for mac 12.0.1 (2019 MacBook pro 16-inch) NTFS-3G 2021.8.22

/bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -Wall -framework CoreFoundation -o ntfsfix ntfsfix.o utils.o ../libntfs-3g/libntfs-3g.la -lc
libtool: link: gcc -g -O2 -Wall -o .libs/ntfsfix ntfsfix.o utils.o ../libntfs-3g/.libs/libntfs-3g.dylib -lc -framework CoreFoundation
Undefined symbols for architecture x86_64:
"_libintl_setlocale", referenced from:
_utils_set_locale in utils.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [ntfsfix] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Copy interruption, U disk is damaged

When the mobile phone is copying files to the ntfs format U disk, the U disk is pulled out, which interrupts the copying process. After that, the files on the U disk cannot be operated, and the U disk needs to be formatted.

Autogen warning message.

Autogen brings this error message (although it completes successfully and I can't see any negative effects):

libtoolize: Remember to add 'LT_INIT' to configure.ac.

The entire console output (including the above message) is here:

>./autogen.sh
Running autoreconf --verbose --install --force
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force -I m4
autoreconf: configure.ac: tracing
autoreconf: running: libtoolize --copy --force
libtoolize: putting auxiliary files in '.'.
libtoolize: copying file './ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'm4'.
libtoolize: copying file 'm4/libtool.m4'
libtoolize: copying file 'm4/ltoptions.m4'
libtoolize: copying file 'm4/ltsugar.m4'
libtoolize: copying file 'm4/ltversion.m4'
libtoolize: copying file 'm4/lt~obsolete.m4'
libtoolize: Remember to add 'LT_INIT' to configure.ac.
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
configure.ac:189: installing './compile'
configure.ac:32: installing './config.guess'
configure.ac:32: installing './config.sub'
configure.ac:36: installing './install-sh'
configure.ac:36: installing './missing'
Makefile.am: installing './INSTALL'
libfuse-lite/Makefile.am: installing './depcomp'
autoreconf: Leaving directory `.'
>

I compiled NTFS-3G, at my 2 systems here: PCLinux and Devuan.

It should be possible to cancel mkfs.ntfs

Example:

# mkfs.ntfs /dev/sdc1 
Cluster size has been automatically set to 4096 bytes.
Initializing device with zeroes:   4%^C^C^C^C^C^C^C^C^C^C^C^C^C^C

And no matter how many Ctrl+C I press, it keeps creating the filesystem on the disk.
Shouldn't mkfs.ntfs stop after a Ctrl+C? Isn't it possible to capture SIGINT and stops whatever mkfs.ntfs is doing, please?

ntfs-3g is Debian's 2021.8.22-3
Linux kernel is 5.15.15

Thanks!

Check if val is NULL before strdup(val)

HELLO,
In the following location of ntfs-3g_common.c/parse_mount_options, val cannot be NULL, but null may be 0

case OPT_USERMAPPING :
  ctx->usermap_path = strdup(val);
  if (!ctx->usermap_path) {
                             ntfs_log_error("no more memory to store'usermapping' option.\n");
                             goto err_exit;
                          }
                          break;

Can we judge null like the following? Or do you have another way?

case OPT_USERMAPPING :
	if(val)
	{
	  ctx->usermap_path = strdup(val);
	  if (!ctx->usermap_path) 
	  {
	    ntfs_log_error("no more memory to store'usermapping' option.\n");
	    goto err_exit;
	  }
	}
	break;

Thank you!

List xattrs in system namespace

Is there a reason that ntfs_fuse_listxattr_common does not list the virtual xattrs (eg. system.ntfs_attrib)? Its confusing that, for instance, system.ntfs_attrib can have a value as returned by getxattr, but it will not show up in listxattr. If its undesirable for the xattrs to be listed in some cases, perhaps there can be an option when mounting to enable/disable the listing of these xattrs.

Patches from AOSC-Dev

There are some patches in AOSC community made back in 2019 against an imported repository dating as far as version 2017.3.23. From what I can tell, they never made it here upstream. And at least one patch is a nice quality of life improvement regarding suid handling. Should we try to accept these patches now?

https://github.com/AOSC-Dev/ntfs-3g/commits/master

How can I open OneDrive folder?

I have dual boot on my computer and I need to enter in my one drive folder from my windows partition.

I saw some links to a plugin download but they don't work, some of them tell me to look on this github.

add wipefs to 'mkfs.ntfs --fast'

Hi,

'mkfs.ntfs --fast' failed to overwrite the existing filesystem.
so, we need add wipefs to 'mkfs.ntfs --fast'

version: v2022.5.17

# mkfs.btrfs -f /dev/vdb1
# wipefs /dev/vdb1
DEVICE OFFSET  TYPE  UUID                                 LABEL
vdb1   0x10040 btrfs 8bcc3d4f-a878-4caa-a992-5bebd8cfea55
# mkfs.ntfs  --fast /dev/vdb1
Cluster size has been automatically set to 4096 bytes.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.
# mount /dev/vdb1 /mnt/test/
mount: /dev/vdb1: more filesystems detected. This should not happen,
       use -t <type> to explicitly specify the filesystem type or
       use wipefs(8) to clean up the device.
# wipefs /dev/vdb1
DEVICE OFFSET  TYPE  UUID                                 LABEL
vdb1   0x3     ntfs  6DEE42C2228DCC8C
vdb1   0x10040 btrfs 8bcc3d4f-a878-4caa-a992-5bebd8cfea55
vdb1   0x1fe   dos
#

Remounting from read-only to read-write allows editing but prevents creating new files

Repro steps (most recently tested on Rocky Linux 8, ntfs-3g-2021.8.22-2):

Become root user.
File test.txt does not exist on NTFS partition at /dev/sdb1.

  1. mount -t ntfs-3g -o ro /dev/sdb1 /mnt/disk
  2. touch /mnt/disk/test.txt
    touch: cannot touch '/mnt/disk/test.txt': Read-only file system
    [this is expected]
  3. mount -o remount,rw /dev/disk
  4. touch /mnt/disk/test.txt
    touch: cannot touch '/mnt/disk/test.txt': No such file or directory

At this point you can edit existing files, just not create new ones.
I expect to be able to create new files as is the case with other filesystem types.

[macOS] building errors

OS: macOS Catalina 10.15.7
errors:

  1. configured with the default build option “--with-fuse=internal”, there are errors while executing 'make':
    [
    fuse.c:1463:31: error: no member named 'st_atim' in 'struct stat'
    tv[0] = attr->st_atim;
    ~~~~ ^
    fuse.c:1468:31: error: no member named 'st_mtim' in 'struct stat'
    tv[1] = attr->st_mtim;
    ~~~~ ^
    2 errors generated.
    make[2]: *** [libfuse_lite_la-fuse.lo] Error 1
    make[1]: *** [all-recursive] Error 1
    make: *** [all] Error 2
    ]

  2. Installed macFuse package, then build with “--with-fuse=external”, "make" command gone well, errors occurred while executing ”make install":
    [
    /Library/Developer/CommandLineTools/usr/bin/ranlib: file: /usr/local/lib/libntfs-3g.a(libntfs_3g_la-realpath.o) has no symbols
    /Library/Developer/CommandLineTools/usr/bin/make install-exec-hook
    if [ ! "/lib" -ef "/usr/local/lib" ]; then
    /bin/mv -f "//usr/local/lib"/libntfs-3g.so
    "//lib";
    fi
    mv: rename //usr/local/lib/libntfs-3g.so
    to //lib/libntfs-3g.so*: No such file or directory
    make[3]: *** [install-exec-hook] Error 1
    make[2]: *** [install-exec-am] Error 2
    make[1]: *** [install-am] Error 2
    make: *** [install-recursive] Error 1**
    ]

how can i fix this ?

Memory leak/logic bug in ntfsusermap.c:callback

The callback function seems to leak memory (to be specific, the accname string is getting leaked here). There also might be some kind of logic bug here as accname is created and then filled with the contents of name, but then never used for anything.

case STATE_HOMES :
accname = (char*)malloc(strlen(name) + 1);
if (accname) {
strcpy(accname, name);
if (context->levels > 0)
recurse(name, fullname,
context->levels - 1,
STATE_BASE);
}
break;

macOS Binary on GitHub releases?

Would you upload the Mac binary to GitHub releases?

Most documentation seems to suggest using brew, which is terrible because it downloads 400mb of unrelated... whatever-it-is, and it's super slow.

It would be great to have an official, 1st party build directly from the source that can be used safely as a user rather than a 3rd party build that requires sudo, installs in a system location, and has 400mb+ of other dependencies.

😀

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.