security audit of explorer code... strcpy -> lstrcpyn strncpy -> lstrcpyn [v]sprintf -> [v]snprintf moved common Shell::get_path() subclass implementations into Shell::get_path_base() and made function overflow-proof make other non-common subclass implementations of get_path overflow-proof Modified: trunk/reactos/subsys/system/explorer/dialogs/searchprogram.cpp Modified: trunk/reactos/subsys/system/explorer/explorer.cpp Modified: trunk/reactos/subsys/system/explorer/notifyhook/notifyhook.c Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp Modified: trunk/reactos/subsys/system/explorer/shell/entries.h Modified: trunk/reactos/subsys/system/explorer/shell/fatfs.cpp Modified: trunk/reactos/subsys/system/explorer/shell/fatfs.h Modified: trunk/reactos/subsys/system/explorer/shell/filechild.cpp Modified: trunk/reactos/subsys/system/explorer/shell/mainframe.cpp Modified: trunk/reactos/subsys/system/explorer/shell/ntobjfs.cpp Modified: trunk/reactos/subsys/system/explorer/shell/ntobjfs.h Modified: trunk/reactos/subsys/system/explorer/shell/regfs.cpp Modified: trunk/reactos/subsys/system/explorer/shell/regfs.h Modified: trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp Modified: trunk/reactos/subsys/system/explorer/shell/shellfs.cpp Modified: trunk/reactos/subsys/system/explorer/shell/shellfs.h Modified: trunk/reactos/subsys/system/explorer/shell/unixfs.cpp Modified: trunk/reactos/subsys/system/explorer/shell/unixfs.h Modified: trunk/reactos/subsys/system/explorer/shell/winfs.cpp Modified: trunk/reactos/subsys/system/explorer/shell/winfs.h Modified: trunk/reactos/subsys/system/explorer/taskbar/favorites.cpp Modified: trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp Modified: trunk/reactos/subsys/system/explorer/utility/shellclasses.cpp Modified: trunk/reactos/subsys/system/explorer/utility/shellclasses.h Modified: trunk/reactos/subsys/system/explorer/utility/utility.h Modified: trunk/reactos/subsys/system/explorer/utility/xmlstorage.h _____
Modified: trunk/reactos/subsys/system/explorer/dialogs/searchprogram.cpp --- trunk/reactos/subsys/system/explorer/dialogs/searchprogram.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/dialogs/searchprogram.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -150,7 +150,7 @@
_thread.Stop();
TCHAR buffer[1024]; - GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, 1024); + GetWindowText(GetDlgItem(_hwnd, IDC_FILTER), buffer, COUNTOF(buffer)); #ifndef __WINE__ ///@todo _tcslwr() for Wine _tcslwr(buffer); #endif @@ -191,7 +191,7 @@ if (SUCCEEDED(hr)) { TCHAR entry_path[MAX_PATH];
- entry->get_path(entry_path); + entry->get_path(entry_path, COUNTOF(entry_path));
String menu_path;
@@ -231,8 +231,8 @@ String lwr_name = cache_entry._entry->_display_name;
#ifndef __WINE__ ///@todo _tcslwr() for Wine - _tcslwr((LPTSTR)lwr_path.c_str()); - _tcslwr((LPTSTR)lwr_name.c_str()); + _tcslwr(&lwr_path.at(0)); + _tcslwr(&lwr_name.at(0)); #endif
if (_lwr_filter.empty()) _____
Modified: trunk/reactos/subsys/system/explorer/explorer.cpp --- trunk/reactos/subsys/system/explorer/explorer.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/explorer.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -183,7 +183,7 @@
const FileTypeInfo& FileTypeManager::operator[](String ext) { #ifndef __WINE__ ///@todo _tcslwr() for Wine - _tcslwr((LPTSTR)ext.c_str()); + _tcslwr(&ext.at(0)); #endif
iterator found = find(ext); @@ -230,7 +230,7 @@ if (type._neverShowExt && !dont_hide_ext) { int len = ext - entry->_data.cFileName; entry->_display_name = (LPTSTR) malloc((len+1)*sizeof(TCHAR)); - _tcsncpy(entry->_display_name, entry->_data.cFileName, len); + lstrcpyn(entry->_display_name, entry->_data.cFileName, len); entry->_display_name[len] = TEXT('\0'); }
@@ -416,7 +416,7 @@ CachePair key(path, idx);
#ifndef __WINE__ ///@todo _tcslwr() for Wine - _tcslwr((LPTSTR)key.first.c_str()); + _tcslwr(&key.first.at(0)); #endif
PathIdxMap::iterator found = _pathIdxMap.find(key); _____
Modified: trunk/reactos/subsys/system/explorer/notifyhook/notifyhook.c --- trunk/reactos/subsys/system/explorer/notifyhook/notifyhook.c 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/notifyhook/notifyhook.c 2005-09-12 21:46:09 UTC (rev 17825) @@ -108,7 +108,7 @@
struct COPYDATA_STRUCT* cds = (struct COPYDATA_STRUCT*) data->lpData;
*phwnd = cds->_hwnd; - strncpy(buffer, cds->_path, size); + lstrcpyn(buffer, cds->_path, size);
return cds->_len; } else _____
Modified: trunk/reactos/subsys/system/explorer/shell/entries.cpp --- trunk/reactos/subsys/system/explorer/shell/entries.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/entries.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -325,7 +325,7 @@
ICON_ID icon_id = ICID_NONE;
- if (get_path(path) && _tcsncmp(path,TEXT("::{"),3)) + if (get_path(path, COUNTOF(path)) && _tcsncmp(path,TEXT("::{"),3)) icon_id = g_Globals._icon_cache.extract(path);
if (icon_id == ICID_NONE) { @@ -392,7 +392,7 @@ { TCHAR cmd[MAX_PATH];
- if (!get_path(cmd)) + if (!get_path(cmd, COUNTOF(cmd))) return FALSE;
// add path to the recent file list @@ -453,7 +453,7 @@ { TCHAR path[MAX_PATH]; /* - if (!get_path(path)) + if (!get_path(path, COUNTOF(path))) return E_FAIL;
ShellPath shell_path(path); @@ -479,7 +479,7 @@ if (!_up) return E_INVALIDARG;
- if (!_up->get_path(path)) + if (!_up->get_path(path, COUNTOF(path))) return E_FAIL;
ShellPath shell_path(path); @@ -505,7 +505,108 @@ return hr; }
+ // get full path of specified directory entry +bool Entry::get_path_base ( PTSTR path, size_t path_count, ENTRY_TYPE etype ) const +{ + int level = 0; + size_t len = 0; + size_t l = 0; + LPCTSTR name = NULL; + TCHAR buffer[MAX_PATH];
+ if ( !path || 0 == path_count ) + return false; + + const Entry* entry; + if ( path_count > 1 ) + { + for(entry=this; entry; level++) { + l = 0; + + if (entry->_etype == etype) { + name = entry->_data.cFileName; + + for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\'); s++) + ++l; + + if (!entry->_up) + break; + } else { + if (entry->get_path(buffer, COUNTOF(buffer))) { + l = _tcslen(buffer); + name = buffer; + + /* special handling of drive names */ + if (l>0 && buffer[l-1]=='\' && path[0]=='\') + --l; + + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + } + + entry = NULL; + break; + } + + if (l > 0) { + if ( len+l+1 >= path_count ) + { + /* compare to 2 here because of terminator plus the '\' we prepend */ + if ( l + 2 > path_count ) + len = 0; + else + len = path_count - l - 2; + } + memmove(path+l+1, path, len*sizeof(TCHAR)); + /* compare to 2 here because of terminator plus the '\' we prepend */ + if ( l+2 >= path_count ) + l = path_count - 2; + memcpy(path+1, name, l*sizeof(TCHAR)); + len += l+1; + + if ( etype == ET_WINDOWS && entry->_up && !(entry->_up->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // a NTFS stream? + path[0] = TEXT(':'); + else + path[0] = TEXT('\'); + } + + entry = entry->_up; + } + + if (entry) { + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + } + + if ( !level && (len+1 < path_count) ) + path[len++] = TEXT('\'); + } + + path[len] = TEXT('\0'); + + return true; +} + // recursively free all child entries void Entry::free_subentries() { _____
Modified: trunk/reactos/subsys/system/explorer/shell/entries.h --- trunk/reactos/subsys/system/explorer/shell/entries.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/entries.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -108,11 +108,14 @@
virtual void read_directory(int scan_flags=SCAN_ALL) {} virtual const void* get_next_path_component(const void*) const {return NULL;} virtual Entry* find_entry(const void*) {return NULL;} - virtual bool get_path(PTSTR path) const = 0; + virtual bool get_path(PTSTR path, size_t path_count) const = 0; virtual ShellPath create_absolute_pidl() const {return (LPCITEMIDLIST)NULL;} virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut); virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL); virtual HRESULT do_context_menu(HWND hwnd, const POINT& pos, CtxMenuInterfaces& cm_ifs); + +protected: + bool get_path_base(PTSTR path, size_t path_count, ENTRY_TYPE etype) const; };
_____
Modified: trunk/reactos/subsys/system/explorer/shell/fatfs.cpp --- trunk/reactos/subsys/system/explorer/shell/fatfs.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/fatfs.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -244,67 +244,9 @@
// get full path of specified directory entry -bool FATEntry::get_path(PTSTR path) const +bool FATEntry::get_path(PTSTR path, size_t path_count) const { - int level = 0; - int len = 0; - int l = 0; - LPCTSTR name = NULL; - TCHAR buffer[MAX_PATH]; - - const Entry* entry; - for(entry=this; entry; level++) { - l = 0; - - if (entry->_etype == ET_FAT) { - name = entry->_data.cFileName; - - for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\'); s++) - ++l; - - if (!entry->_up) - break; - } else { - if (entry->get_path(buffer)) { - l = _tcslen(buffer); - name = buffer; - - /* special handling of drive names */ - if (l>0 && buffer[l-1]=='\' && path[0]=='\') - --l; - - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - entry = NULL; - break; - } - - if (l > 0) { - memmove(path+l+1, path, len*sizeof(TCHAR)); - memcpy(path+1, name, l*sizeof(TCHAR)); - len += l+1; - - path[0] = TEXT('\'); - } - - entry = entry->_up; - } - - if (entry) { - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - if (!level) - path[len++] = TEXT('\'); - - path[len] = TEXT('\0'); - - return true; + return get_path_base ( path, path_count, ET_FAT ); }
ShellPath FATEntry::create_absolute_pidl() const @@ -315,7 +257,7 @@ /* prepend root path if the drive is currently actually mounted in the file system -> return working PIDL TCHAR path[MAX_PATH];
- if (get_path(path)) + if (get_path(path, COUNTOF(path))) return ShellPath(path);
return ShellPath(); _____
Modified: trunk/reactos/subsys/system/explorer/shell/fatfs.h --- trunk/reactos/subsys/system/explorer/shell/fatfs.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/fatfs.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -34,7 +34,7 @@
protected: FATEntry() : Entry(ET_FAT) {}
- virtual bool get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const; virtual ShellPath create_absolute_pidl() const;
DWORD _cluster; _____
Modified: trunk/reactos/subsys/system/explorer/shell/filechild.cpp --- trunk/reactos/subsys/system/explorer/shell/filechild.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/filechild.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -280,7 +280,7 @@
_right->set_header(); }
- entry->get_path(_path); + entry->get_path(_path, COUNTOF(_path)); }
if (_hwnd) // only change window title if the window already exists @@ -453,7 +453,7 @@ TCHAR path[MAX_PATH];
if (_left && _left->_cur) { - _left->_cur->get_path(path); + _left->_cur->get_path(path, COUNTOF(path)); SetCurrentDirectory(path); }
_____
Modified: trunk/reactos/subsys/system/explorer/shell/mainframe.cpp --- trunk/reactos/subsys/system/explorer/shell/mainframe.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/mainframe.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -1608,7 +1608,7 @@
TCHAR path[MAX_PATH];
- if (shell_entry->get_path(path)) { + if (shell_entry->get_path(path,COUNTOF(path))) { String url;
if (path[0] == ':') _____
Modified: trunk/reactos/subsys/system/explorer/shell/ntobjfs.cpp --- trunk/reactos/subsys/system/explorer/shell/ntobjfs.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/ntobjfs.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -237,12 +237,12 @@
} else { info->type.string_ptr = TEXT(""); } - wcscpyn(p, info->name.string_ptr, _MAX_PATH); + lstrcpynW(p, info->name.string_ptr, _MAX_PATH); #else WideCharToMultiByte(CP_ACP, 0, info->name.string_ptr, info->name.string_len, p, MAX_PATH, 0, 0); #endif
- lstrcpy(w32fd.cFileName, p); + lstrcpyn(w32fd.cFileName, p, sizeof(w32fd.cFileName) / sizeof(0[w32fd.cFileName]));
const LPCWSTR* tname = NTDLL::s_ObjectTypes; OBJECT_TYPE type = UNKNOWN_OBJECT_TYPE; @@ -379,67 +379,9 @@
// get full path of specified directory entry -bool NtObjEntry::get_path(PTSTR path) const +bool NtObjEntry::get_path(PTSTR path, size_t path_count) const { - int level = 0; - int len = 0; - int l = 0; - LPCTSTR name = NULL; - TCHAR buffer[MAX_PATH]; - - const Entry* entry; - for(entry=this; entry; level++) { - l = 0; - - if (entry->_etype == ET_NTOBJS) { - name = entry->_data.cFileName; - - for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\'); s++) - ++l; - - if (!entry->_up) - break; - } else { - if (entry->get_path(buffer)) { - l = _tcslen(buffer); - name = buffer; - - /* special handling of drive names */ - if (l>0 && buffer[l-1]=='\' && path[0]=='\') - --l; - - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - entry = NULL; - break; - } - - if (l > 0) { - memmove(path+l+1, path, len*sizeof(TCHAR)); - memcpy(path+1, name, l*sizeof(TCHAR)); - len += l+1; - - path[0] = TEXT('\'); - } - - entry = entry->_up; - } - - if (entry) { - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - if (!level) - path[len++] = TEXT('\'); - - path[len] = TEXT('\0'); - - return true; + return get_path_base ( path, path_count, ET_NTOBJS ); }
BOOL NtObjEntry::launch_entry(HWND hwnd, UINT nCmdShow) _____
Modified: trunk/reactos/subsys/system/explorer/shell/ntobjfs.h --- trunk/reactos/subsys/system/explorer/shell/ntobjfs.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/ntobjfs.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -91,7 +91,7 @@
protected: NtObjEntry(OBJECT_TYPE type) : Entry(ET_NTOBJS), _type(type) {}
- virtual bool get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const; virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow); };
_____
Modified: trunk/reactos/subsys/system/explorer/shell/regfs.cpp --- trunk/reactos/subsys/system/explorer/shell/regfs.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/regfs.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -223,67 +223,9 @@
// get full path of specified registry entry -bool RegEntry::get_path(PTSTR path) const +bool RegEntry::get_path(PTSTR path, size_t path_count) const { - int level = 0; - int len = 0; - int l = 0; - LPCTSTR name = NULL; - TCHAR buffer[MAX_PATH]; - - const Entry* entry; - for(entry=this; entry; level++) { - l = 0; - - if (entry->_etype == ET_REGISTRY) { - name = entry->_data.cFileName; - - for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\'); s++) - ++l; - - if (!entry->_up) - break; - } else { - if (entry->get_path(buffer)) { - l = _tcslen(buffer); - name = buffer; - - /* special handling of drive names */ - if (l>0 && buffer[l-1]=='\' && path[0]=='\') - --l; - - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - entry = NULL; - break; - } - - if (l > 0) { - memmove(path+l+1, path, len*sizeof(TCHAR)); - memcpy(path+1, name, l*sizeof(TCHAR)); - len += l+1; - - path[0] = TEXT('\'); - } - - entry = entry->_up; - } - - if (entry) { - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - if (!level) - path[len++] = TEXT('\'); - - path[len] = TEXT('\0'); - - return true; + return get_path_base ( path, path_count, ET_REGISTRY ); }
BOOL RegEntry::launch_entry(HWND hwnd, UINT nCmdShow) _____
Modified: trunk/reactos/subsys/system/explorer/shell/regfs.h --- trunk/reactos/subsys/system/explorer/shell/regfs.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/regfs.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -34,7 +34,7 @@
protected: RegEntry() : Entry(ET_REGISTRY) {}
- virtual bool get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const; virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow); };
_____
Modified: trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp --- trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/shellbrowser.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -626,7 +626,7 @@
TCHAR path[MAX_PATH];
- if (shell_entry->get_path(path)) { + if (shell_entry->get_path(path, COUNTOF(path))) { String url;
if (path[0] == ':') _____
Modified: trunk/reactos/subsys/system/explorer/shell/shellfs.cpp --- trunk/reactos/subsys/system/explorer/shell/shellfs.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/shellfs.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -126,8 +126,10 @@
// get full path of a shell entry -bool ShellEntry::get_path(PTSTR path) const +bool ShellEntry::get_path(PTSTR path, size_t path_count) const { + if ( !path || 0 == path_count ) + return false; /* path[0] = TEXT('\0');
@@ -138,7 +140,7 @@ LPCTSTR ret = fs_path;
if (ret) { - _tcscpy(path, ret); + lstrcpyn(path, ret, path_count); return true; } else return false; @@ -146,10 +148,13 @@
// get full path of a shell folder -bool ShellDirectory::get_path(PTSTR path) const +bool ShellDirectory::get_path(PTSTR path, size_t path_count) const { CONTEXT("ShellDirectory::get_path()");
+ if ( !path || 0 == path_count ) + return false; + path[0] = TEXT('\0');
if (_folder.empty()) @@ -163,7 +168,7 @@ if (!(attribs & SFGAO_FILESYSTEM)) return false;
- if (FAILED(path_from_pidl(get_parent_folder(), &*_pidl, path, MAX_PATH))) + if (FAILED(path_from_pidl(get_parent_folder(), &*_pidl, path, path_count))) return false;
return true; @@ -235,11 +240,12 @@
TCHAR buffer[MAX_PATH];
- if ((scan_flags&SCAN_FILESYSTEM) && get_path(buffer) && _tcsncmp(buffer,TEXT("::{"),3)) { + if ((scan_flags&SCAN_FILESYSTEM) && get_path(buffer, COUNTOF(buffer)) && _tcsncmp(buffer,TEXT("::{"),3)) { Entry* entry = NULL; // eliminate useless GCC warning by initializing entry
LPTSTR p = buffer + _tcslen(buffer);
+ // TODO FIXME - this can overflow lstrcpy(p, TEXT("\*"));
WIN32_FIND_DATA w32fd; _____
Modified: trunk/reactos/subsys/system/explorer/shell/shellfs.h --- trunk/reactos/subsys/system/explorer/shell/shellfs.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/shellfs.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -32,7 +32,7 @@
ShellEntry(Entry* parent, LPITEMIDLIST shell_path) : Entry(parent, ET_SHELL), _pidl(shell_path) {} ShellEntry(Entry* parent, const ShellPath& shell_path) : Entry(parent, ET_SHELL), _pidl(shell_path) {}
- virtual bool get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const; virtual ShellPath create_absolute_pidl() const; virtual HRESULT GetUIObjectOf(HWND hWnd, REFIID riid, LPVOID* ppvOut); virtual BOOL launch_entry(HWND hwnd, UINT nCmdShow=SW_SHOWNORMAL); @@ -103,7 +103,7 @@ virtual const void* get_next_path_component(const void*) const; virtual Entry* find_entry(const void*);
- virtual bool get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const;
int extract_icons();
_____
Modified: trunk/reactos/subsys/system/explorer/shell/unixfs.cpp --- trunk/reactos/subsys/system/explorer/shell/unixfs.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/unixfs.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -156,40 +156,68 @@
// get full path of specified directory entry -void UnixEntry::get_path(PTSTR path) const +bool UnixEntry::get_path(PTSTR path, size_t path_count) const { int level = 0; - int len = 0; + size_t len = 0;
- for(const Entry* entry=this; entry; level++) { - LPCTSTR name = entry->_data.cFileName; - int l = 0; + if ( !path || 0 == path_count ) + return false;
- for(LPCTSTR s=name; *s && *s!=TEXT('/'); s++) - ++l; + if ( path_count > 1 ) + { + for(const Entry* entry=this; entry; level++) { + LPCTSTR name = entry->_data.cFileName; + size_t l = 0;
- if (entry->_up) { - if (l > 0) { - memmove(path+l+1, path, len*sizeof(TCHAR)); - memcpy(path+1, name, l*sizeof(TCHAR)); - len += l+1; + for(LPCTSTR s=name; *s && *s!=TEXT('/'); s++) + ++l;
- path[0] = TEXT('/'); + if (entry->_up) { + if (l > 0) { + if ( len+l+1 >= path_count ) + { + /* compare to 2 here because of terminator plus the '\' we prepend */ + if ( l + 2 > path_count ) + len = 0; + else + len = path_count - l - 2; + } + memmove(path+l+1, path, len*sizeof(TCHAR)); + /* compare to 2 here because of terminator plus the '\' we prepend */ + if ( l+2 >= path_count ) + l = path_count - 2; + memcpy(path+1, name, l*sizeof(TCHAR)); + len += l+1; + + path[0] = TEXT('/'); + } + + entry = entry->_up; + } else { + if ( len+l >= path_count ) + { + if ( l + 1 > path_count ) + len = 0; + else + len = path_count - l - 1; + } + memmove(path+l, path, len*sizeof(TCHAR)); + if ( l+1 >= path_count ) + l = path_count - 1; + memcpy(path, name, l*sizeof(TCHAR)); + len += l; + break; } + }
- entry = entry->_up; - } else { - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - break; - } + if ( !level && (len+1 < path_count) ) + path[len++] = TEXT('/'); }
- if (!level) - path[len++] = TEXT('/'); + path[len] = TEXT('\0');
- path[len] = TEXT('\0'); + return true; }
#endif // __WINE__ _____
Modified: trunk/reactos/subsys/system/explorer/shell/unixfs.h --- trunk/reactos/subsys/system/explorer/shell/unixfs.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/unixfs.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -35,7 +35,7 @@
protected: UnixEntry() : Entry(ET_UNIX) {}
- virtual void get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const; };
struct UnixDirectory : public UnixEntry, public Directory _____
Modified: trunk/reactos/subsys/system/explorer/shell/winfs.cpp --- trunk/reactos/subsys/system/explorer/shell/winfs.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/winfs.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -229,70 +229,9 @@
// get full path of specified directory entry -bool WinEntry::get_path(PTSTR path) const +bool WinEntry::get_path(PTSTR path, size_t path_count) const { - int level = 0; - int len = 0; - int l = 0; - LPCTSTR name = NULL; - TCHAR buffer[MAX_PATH]; - - const Entry* entry; - for(entry=this; entry; level++) { - l = 0; - - if (entry->_etype == ET_WINDOWS) { - name = entry->_data.cFileName; - - for(LPCTSTR s=name; *s && *s!=TEXT('/') && *s!=TEXT('\'); s++) - ++l; - - if (!entry->_up) - break; - } else { - if (entry->get_path(buffer)) { - l = _tcslen(buffer); - name = buffer; - - /* special handling of drive names */ - if (l>0 && buffer[l-1]=='\' && path[0]=='\') - --l; - - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - entry = NULL; - break; - } - - if (l > 0) { - memmove(path+l+1, path, len*sizeof(TCHAR)); - memcpy(path+1, name, l*sizeof(TCHAR)); - len += l+1; - - if (entry->_up && !(entry->_up->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // a NTFS stream? - path[0] = TEXT(':'); - else - path[0] = TEXT('\'); - } - - entry = entry->_up; - } - - if (entry) { - memmove(path+l, path, len*sizeof(TCHAR)); - memcpy(path, name, l*sizeof(TCHAR)); - len += l; - } - - if (!level) - path[len++] = TEXT('\'); - - path[len] = TEXT('\0'); - - return true; + return get_path_base ( path, path_count, ET_WINDOWS ); }
ShellPath WinEntry::create_absolute_pidl() const @@ -301,7 +240,7 @@
TCHAR path[MAX_PATH];
- if (get_path(path)) + if (get_path(path, COUNTOF(path))) return ShellPath(path);
return ShellPath(); _____
Modified: trunk/reactos/subsys/system/explorer/shell/winfs.h --- trunk/reactos/subsys/system/explorer/shell/winfs.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/shell/winfs.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -34,7 +34,7 @@
protected: WinEntry() : Entry(ET_WINDOWS) {}
- virtual bool get_path(PTSTR path) const; + virtual bool get_path(PTSTR path, size_t path_count) const; virtual ShellPath create_absolute_pidl() const; };
_____
Modified: trunk/reactos/subsys/system/explorer/taskbar/favorites.cpp --- trunk/reactos/subsys/system/explorer/taskbar/favorites.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/taskbar/favorites.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -395,7 +395,7 @@
ShellDirectory new_dir(dir._folder, static_cast<ShellEntry*>(entry)->_pidl, hwnd);
new_folder._bookmarks.import_IE_favorites(new_dir, hwnd); } else { - entry->get_path(path); + entry->get_path(path, COUNTOF(path)); ShellDirectory new_dir(GetDesktopFolder(), path, hwnd);
new_folder._bookmarks.import_IE_favorites(new_dir, hwnd); } @@ -406,7 +406,7 @@
bookmark._name = DecodeXMLString(name);
- entry->get_path(path); + entry->get_path(path, COUNTOF(path)); _tsplitpath(path, NULL, NULL, NULL, ext);
if (!_tcsicmp(ext, TEXT(".url"))) { _____
Modified: trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp --- trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/taskbar/startmenu.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -249,7 +249,7 @@
_tcscat(ignore_path, ignore_dir); _tcscat(ignore_name, ignore_ext);
- dir.get_path(dir_path); + dir.get_path(dir_path, COUNTOF(dir_path));
if (_tcsicmp(trim_path_slash(dir_path), trim_path_slash(ignore_path))) *ignore_name = '\0'; @@ -1286,7 +1286,7 @@ else { TCHAR path[MAX_PATH];
- if (entry->get_path(path)) + if (entry->get_path(path, COUNTOF(path))) new_folders.push_back(path); }
_____
Modified: trunk/reactos/subsys/system/explorer/utility/shellclasses.cpp --- trunk/reactos/subsys/system/explorer/utility/shellclasses.cpp 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/utility/shellclasses.cpp 2005-09-12 21:46:09 UTC (rev 17825) @@ -44,7 +44,7 @@
// helper functions for string copying
-LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count) +/*LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count) { LPCSTR s; LPSTR d = dest; @@ -64,7 +64,7 @@ count--;
return dest; -} +}*/
String COMException::toString() const _____
Modified: trunk/reactos/subsys/system/explorer/utility/shellclasses.h --- trunk/reactos/subsys/system/explorer/utility/shellclasses.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/utility/shellclasses.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -85,7 +85,7 @@
LocalFree(pBuf); } else { TCHAR buffer[128]; - _stprintf(buffer, TEXT("unknown Exception: 0x%08lX"), _hr); + _sntprintf(buffer, COUNTOF(buffer), TEXT("unknown Exception: 0x%08lX"), _hr); _msg = buffer; } } @@ -769,14 +769,14 @@
#ifdef UNICODE #define StrRet StrRetW -#define tcscpyn wcscpyn +//#define tcscpyn wcscpyn #else #define StrRet StrRetA -#define tcscpyn strcpyn +//#define tcscpyn strcpyn #endif
-extern LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count); -extern LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count); +//extern LPSTR strcpyn(LPSTR dest, LPCSTR source, size_t count); +//extern LPWSTR wcscpyn(LPWSTR dest, LPCWSTR source, size_t count);
/// easy retrieval of multi byte strings out of STRRET structures struct StrRetA : public STRRET @@ -795,11 +795,11 @@ break;
case STRRET_OFFSET: - strcpyn(b, (LPCSTR)&shiid+UNION_MEMBER(uOffset), l); + lstrcpynA(b, (LPCSTR)&shiid+UNION_MEMBER(uOffset), l); break;
case STRRET_CSTR: - strcpyn(b, UNION_MEMBER(cStr), l); + lstrcpynA(b, UNION_MEMBER(cStr), l); } } }; @@ -817,7 +817,7 @@ { switch(uType) { case STRRET_WSTR: - wcscpyn(b, UNION_MEMBER(pOleStr), l); + lstrcpynW(b, UNION_MEMBER(pOleStr), l); break;
case STRRET_OFFSET: _____
Modified: trunk/reactos/subsys/system/explorer/utility/utility.h --- trunk/reactos/subsys/system/explorer/utility/utility.h 2005-09-12 20:07:29 UTC (rev 17824) +++ trunk/reactos/subsys/system/explorer/utility/utility.h 2005-09-12 21:46:09 UTC (rev 17825) @@ -804,7 +804,7 @@
TCHAR b[BUFFER_LEN];
[truncated at 1000 lines; 86 more skipped]