This is an internal, informal unedited list of fixed bugs, changes and beta notes during the 2.0 development process. It is provided as a courtesy to developers and other power-users. Please do not ask us questions about this list -- if you don't have a problem to report with 2.0 you don't have a problem. Please also realize that most software has lists of fixed bugs at least this large -- they just usually aren't made public. The large list doesn't mean that the software was unreliable or not useful for most users in previous versions. Hopefully more software vendors will be more open, since openness provides more confidence to sophisticated users than it does scare people about the number of small bugs in typical software. We no longer have a list of known bugs. If we knew about them, we'd have fixed 'em. Fixed bugs and changes since Envoy 1.6a ======================================= [Really important behaviour changes are marked with '!!'] - Crash on aborting examines (C:LIST, CTRL-C). - FindService() returning garbage error codes. - GetHostName() appending LocalHost to the passed buffer for a NULL enitity passed. - Crashes in HostRequestA(). Lousy GUI code. Fixed for now. Should be replaced. - Repaired half a ton of "cast" bugs. Lots of code used inappropriate and sometimes really destructive casts. - NIPCBuffer trashing on local ACTION_READ and ACTION_WRITE. - endless retry on security reject which in essence hangs the client and loads the line. - filesystem.service used to open after one failed open if nipc.library was available, even if the other libraries needed were not. Net result ==> GURU! - ACTION_SET_FILE_SIZE should work now. - hanging lock on security failure when trying to enter a directory. - fs server left locks on failing mount requests for non existing volumes. - on mount fs server reported "doesn't exist" when it in fact rejected the user. - server had serious problems with handling requester suppression on a mount. - ACTION_FH_FROM_LOCK works now. - fcconfig deleted temporary ".info" file manually. It now uses DeleteDiskObject(). - fsconfig did not really fit onto a 640x200 topaz 8 WB. - The fs code and the fs prefs code duplicated many structures and defines which should have been defined in one place only to avoid compatibility breaks. Fixed now. Referencing includes across directories is not nice but a lot better than duplicating their contents arbitrarily. I need to do something about nipc, too. - Cleaned out obsolete intuition identifiers where I found them. - Groups prefs has now a better login. - About menus added to the filesystem prefs editors. - An english locale text for the nipc prefs was too long. Fixed. - Small kludge added to nipc.library to have Envoy 1.65 behaviour on the S2 CopyFromBuffer callback. Envoy 1.65 always returned success on this callback no matter what. Hmm. DO NOT DEPEND ON THIS! - Missing Permit() in FindEntity() code could potentially have stopped the system. - nipc S2 code could leave buffer lying around on low memory. - nipc S2 code did not necessarily queue ARP requests again when the remote side came back into service. - internal nipc S2 packet counters for internal statistics were not handled correctly. Doesn't matter for the user though. This was more a cosmetic fix. - nipc UDP closed connection via Forbid() protection while the list was otherwise semaphore protected. - nipc ARP buffer entry timeout value was wrong by a factor of 10. - nipc doesn't depend on services.library internals anymore. services.library V40(!) has special private access functions now. services manager uses these for locking now, too. - CreateEntityA() made the entity available before it was fully initialised. If this was done just at the "right" time, nipc.library would crash or do other strange things. - nipc RDP made an active connection available on open before having set up all data needed. - gross bugs in nipc RDP handling. The headerlength was not set according to RFC908 and on dataless "flag" packets the wrong sequence number was used! Actually I am not sure if RDP works as described in RFC908/1151 at all. The code looks more like "we do it not quite like they do it" which really is annoying. - dataless RDP packets updated the sequence number of the last ack'ed packet to the current one even if there was no ack! - nipc RDP data acceptance via PacketIn() had major problems: - If a needed packet in sequence did not arrive, it would continue to queue even redundant packets until death. - In two places it had search algorithms with an O(n^2) like brute force approach to the problem. Hmpfh. - it ack'ed segments but did not tell the timeout code that those segments were acked. So the timeout code sent another ack. I rewrote this completely. No reasonable way to fix it without throwing it out. - nipc RDP code would in some cases either dereference NULL pointers or other invalid list pointers, access closed (non existing!) connections, or send spurious resets to the other side with garbage sequence numbers. - On closing nipc RDP connections in the listening state, the RDP code sent a reset to some undiscovered country. - nipc RDP resets were not necessarily obeyed. - While checking on some nipc stuff I found that NIPCConfig would really barf on you if you tried to use the Realm configuration screen. As it turned out, someone used "mlh_Tail" instead of "mlh_TailPred" for walking a list. - nipc AMP code cleared out all the RDP flags when it had been signaled on an available transmit window. '!' was used for inverting a bit mask rather than '~' in three places scattered in BeginTransaction() and ReplyTransaction()! A sure killer IMHO. The same bug was in DeleteEntity() in handling entity flags. Just wondering: How did nipc work at all? ;^) :-( - nipc RDP will now flush still pending writes when they are acknowledged, not only on a timeout run after it has timed out! - On startup nipc will do better checking of any sana2 device it tries to open. This fixes e.g. an open amoksana.device with no HW connected. - If a sana2 device goes into "failure mode" and barfs on any and all requests for some reason, nipc.library would hog the CPU and in effect lock the system. Error handling tries to be smarter now, even though there is no true general solution to the problem. This should help in most cases, though. - FindEntity() messed with an entity after releasing the entity list semaphore. Tiny window, but a window. - password hook in the login requester fixed. Now it is possible to delete a password that is too long and retype it. - printer prefs and Users are now localised. - Strange double click behaviour in Filesystem Imports ListView fixed. - fixed potential holes in nipc sana 2 code that could have messed up sana 2 addresses with a bit count that is not a multipe of eight. - nipc sana 2 code did not clear allocated IORequest memory in all cases. This could have caused strange flag settings etc. !! - nipc ARP will now be used for all HW types, not just for !! ethernet connections. This is an incompatible change but fixes !! the HW address vs. IP address dependency problems. !! - If the user chose defaults for IP and ARP type in the network !! configuration for a device, he will get ethernet values 2048 and 2054 !! unless ARCNET is used. Then 240 and 241 are used as defaults !! in nipc.library. While this is not a good solution at all as it !! doesn't take into account the actual HW available, it will at !! least give reproducible results compared to the "ignore the !! checkmarks and take whatever we have" type of behaviour. - There is a major conceptual problem with RDP sequence number wrap around. This always has and still does completely confuse the RDP code and will in effect make the RDP connection affected unusable and probably flood the net with packet retransmits that are never correctly acknowledged. I am in the process of doing something about this, but this is a _very_ tricky subject. Hopefully my rework of sequence number handling works. This needs more testing. - With my RDP rework I added a new bug affecting the start up of a connection. For fixing this bug I did some heavy RDP debugging. So RDP connections should work a lot better now. Especially starting up an RDP connection should be now as fast as it used to be again. Again, the new release might be incompatible to previous buggy releases. Sorry for the inconvenience. We are now at nipc.library 40.18. - Changed the printspool.service naming convention for jobs from "t:job%ld" to "T:EnvoyPrintJob_%ld" to avoid any conflicts. - Services Configuration should no longer leave filelocks or library opens hanging! It will also default to "/Services" now as directory for adding services (it is based in Configurations!). This should help poor B. J. User somewhat. - Back to the filesystem. ACTION_READ_LINK returned DOSTRUE and ERROR_ACTION_NOT_KNOWN for some strange reason. Fixed. This shouldn't have been a problem anyway as ReadLink() should only be called if ERROR_IS_SOFT_LINK has been returned by the FS, which of course cannot happen. - Found a hole in internal restarts of ExAll type requests. Packets were added to the head of the main FS packet port without any protection at all! - ACTION_MAKE_LINK will now work for hard links. This might e.g. help DUUCP users with a networked news tree. - I decided to finally try it: Record locking should work now. This needs more testing though for reliability. - ACTION_DELETE_OBJECT may take a lot longer for large files than pretty much any other packet. So the default timeout of 6 seconds was not enough and even though the packet succeeded, the network transaction timed out. I bumped the timeout to 18 seconds for a delete. This stuff shouldn't be done via a single transaction, but it is not at all easy to rewrite! Bumping the timeout is not a solution but it'll make the situation at least a lot better for most users. - Really nasty bug on reconnect of a broken network mount. The client passed the full server path of the object in question without the server drive specifier. This could lead to write files popping up in strange places suddenly and read files not to reconnect. Same problem fixed for locks. - ACTION_READ/ACTION_WRITE could still leave buffers lying around on failure. Should be fixed now. - ACTION_READ/ACTION_WRITE would pretty much garble the client seek position on network failure or partial R/W failure. Now a bona fide attempt is done to keep the seek position correct. This might still fail of course, but this is better than not doing anything at all about it. - While an ACTION_READ/ACTION_WRITE is pending all incoming packets for this file handle are saved and queued again after the R/W is complete. The packets were requeued in reversed order and without sufficient list protection. - I found a reproducible case where after a reconnect the client was accessing the root of the mounted server drive where the network volume is located, and not the root of the network volume. - The server did not clean up exall handling for locks discarded on a dead mount. - The client/server had an internal concept of a -1 lock which represented the current server directory on reconnect. No code used this feature for anything useful and it messed up reconnections with volume relative paths. I took it out. Reconnect works volume base relative now. - ACTION_EXAMINE_ALL was commented out on the client side. Why? Because it was totally and absolutely f...ouled up in many subtle ways on both the client and server side. It should work now. Please test this and all the bells and whistles like eac_MatchFunc in detail. Why I did all this work? Because EXAMINE_ALL and all the other examine functions share common code. So I had to fix it. - ACTION_EXAMINE_NEXT could be ended prematurely, pulling out the rug under the client while doing this. - The server tried to filter filenames in the examine calls even if there was no buffer space set up. - Did some autodoc typo fixes in nipc.library. - Tiny change in nipc.library's buffer handling. What is externally visible as AppendNIPCBuff() will now move the list of buffer entries in one piece instead of entry after entry. This saves some CPU time. I improved this on the way as I found a possible cause for an enforcer hit in low memory situations. Found this due to a bug report on nipc enforcer hits that were actually caused by the fs code. - With the fs update, I introduced a bug in R/W buffer handling that could cause enforcer hits in nipc.library under certain network failure situations. Fixed, hopefully. - Interesting enough, I cultivated a bug in exall handling when redoing the exall stuff. The matchstring was passed to the server to filter entries. While this is in theory a neat idea by the C= guys to save on the actual transfer, it doesn't work as I know now. Preparsed patterns are not portable between different dos.library versions. Now all the filtering is done on the client side. This is unfortunately much less efficient. - Another bug was in filtering of exall entries on the client side. It did not remove entries correctly in all cases. - The sana2 code in nipc.library could "forget" to requeue packets for ARP under certain conditions. It also queued read packets for devices known to be offline which is totally useless and hogs the CPU. - Slight rework of R/W packet handling to be on the safe side. I _think_ I found the hole causing spurious enforcer hits via nipc.library once in a while, but I am not sure yet. - "Network Configuration" will no longer force the realm checkboxes set, just because there are entries in the realm lists. This makes it possible to turn off a realmserver without loosing the entered prefs data. - It should be possible now to use the RETURN key in the "Network Configuration" "Host Configuration" panel to hop from gadget to gadget just like with all the other panels. - There is still a bug in the RDP code when a packet sequence number wrap around occurs. I found this based on a hunch regarding the "overnight hanging bug". This bug in effect breaks the connection. I have started to investigate and fix this, and as a result the new nipc.library will once again be absolutely incompatible to previous versions. Sorry. A side effect of my work for a fix is that some fields are now 32 bit aligned which should help on anything >=68020, i.e. >= A1200. - Sequence number wraparound should be ok now. Finally. - Fixed a few holes in the RDP code where a task waiting on RDP permission to send stuff would sleep forever. When this happened due to the sequence number wrap around bug, this connection would effectively hang. This should explain and fix the "overnight hangs" for good. I hope there isn't more of this. We are now at nipc.library 40.24. - Note that nipc will not use trans_Timeout for local transactions currently. So a local entity connection will hang if the destination hangs. The source has no chance to recover. I feel that this is a bug (which is currently hard to fix). What do you think? COMMENTS ARE WELCOME! - The server could show erratic behaviour if you sent paths longer than 128 characters to ACTION_LOCATE/DELETE_OBJECT and ACTION_CREATE_DIR. - ACTION_SET_DATE would return garbage results on a security failure. - ACTION_CHANGE_MODE was flaky with filehandles before. Should work now. - fs server locked a semaphore a few lines to late. No problem with normal use, but still a bug. - On cleaning up dead mounts, the server left a lock lying around. - The client was flaky with timeout settings on reconnect. This could hang a reconnect. - Unlocking NULL locks is not nice, but should be regarded as ok. This is now the case. - Believe it or not, I found another nipc bug. If you deleted a public entity that still had connections pending, it would be silenced as far as possible, but not be made private. This would lead to enforcer hits if a remote side tried to enumerate entities. As a side effect of my fix, FindEntity() will now behave according to spec and only find local entites if they were created with ENT_Public, just like with remote entities. We are now up to nipc.library 40.25. How many revision will there be? - ACTION_DELETE_OBJECT will now run async on the server. It should no longer block server activity for other clients until the delete is done. The client will get a response when the delete is done, but the server is not locked up for other clients in the meantime. - The client is now a little better about doing at least one retry with a prolonged timeout itself before putting up a requester. So timeout requesters will come later now. - EFS should behave _much_better_ now with server drives having RMS. It used to barf in many ways, now it should handle this rather gracefully and hopefully do the right thing in all cases. As this needs truly tons of testing, I hesitate to say that Envoy has RMS now. While the mounts on the client turn up as public entities now, it won't make any sense for a user to FindEntity() them. They are public only to let the server be able to contact them in majik wayz. Please try this with CDx: and DFx: and whatever you got. Note that RMS does not carry across machines. You can't export a volume in df0:, get locks on it on the client, move the disk physically to the client's disk drives and expect it to be recognized. !! - A BEHAVIOUR CHANGE of fs exports. An export with an empty export !! name used to get the clients device mount name. Now it will get !! the true volume name of the servers volume. This makes much more !! sense and an empty name is now the preferred setting for !! exporting a DOS device with RMS. Actually it is probably !! reasonable to say a few things about RMS name handling and !! reconnect behaviour now. As described above the client used to !! have the same name for the volume node as for the client's !! device node if no export name was specified on the server. This !! was not logical, as both the export and import prefs listed the !! server's export path (typically a device name) in this case. In !! this case the client can make much more use of the server's !! volume name. All this does not affect name use of the client at !! all, as of course the device node is still there and any !! reference to that name will now go via the device node instead !! of the volume node. Nothing is lost. The client just has !! additional information available via the correct volume node. !! RMS and reconnect are related to the above. If an export name is !! configured on the server, it will be only used on a mount of an !! inserted volume or a reconnect (which is in effect a remount). !! If no name is configured the true volume name will be used. For !! any disk change, only the true volume nname will be used. Why? !! because having different active volumes with all the same name !! doesn't make much sense. So there is one simple rule now: If you !! export a drive/device with RMS, don't specify an export name. - the server should no longer work with garbage guid/uid's on low memory situations. - I got tired of rebooting, so now the server supports file notification on its prefs file in ENV:. One can change the export configuration on the fly now. The Services Manager will also try to reload its configuration now if it has been changed. Note that this cannot (and probably should not) be done easily for nipc due to how all the stuff works. - Added a "Use" button to the fs export prefs and appropriate menu headers to select env: or envarc: values. Default is empty. - Services Prefs behaved strange when using the "Last Saved" menu. It appended the stuff to the current list of services. - Notification should be working now. Some special notes about this, though: a) Any action done through EFS that should cause a notification of the client, will cause one (Guru Book!). The ROM fs and RAM handler don't do it that way. b) Any action done through the server fs will cause a notification if that fs supports notification for the action. Needed to get notifed of other's accesses. c) As a result, any action done through EFS will cause 1 notification event if only EFS supports it, and 2 notification events if both EFS and the server fs support it. While two events can be annoying at times, they are better than none at all. I have no way to tell which actions on the server side fs will cause a notification by that fs and which won't. Please test this with both signal and message notification and whatever flags there are, and with reconnect! - The login requester password hook was a pain. I removed editing restrictions now to make it work. For users that get lost in typing in dots this means, they probably better kill the contents and retype in some cases. - The printer server should now process spooled client files in 8k chunks instead of 1k chunks. This _might_ help efficiency. - ACTION_WRITE_PROTECT is supported now. It will leave the server untouched and do only client side write protection. - Another change for ACTION_DELETE_OBJECT. While it doesn't block server operation anymore for other mounts, all packets for the client mount of the delete will be queued until the delete is done and processed afterwards. Why? To guarantee sequential behaviour in packet processing. Note: PLEASE TEST THIS! Maybe by sending of an async delete packet and sending other packets before the reply comes in. I don't trust my own tests at all here. This stuff is tricky. - String gadgets in Login/Host requester will be activated on window activation. - String gadget contents in Host requester will now be used even if it wasn't deactivated by TAB/ENTER. - I decided not to do anything about the string gadgets in Network Configuration, Users, and Groups. This doesn't hurt too much and would require some rewrite. - I think I found the "split file on reconnect" bug. Finally. A baselock for a path of a file to open was assumed to be the parent lock of the file itself. So any path specs in the file name got lost on the way which messed up paths for reconnect. - As Dale correctly said, the printer stuff is FUBAR. Unless there are any error reports, I probably won't touch it again. it needs to be rethought and rewritten from scratch. - Due to all the changes outlined above, I decided to call this Envoy 2.0, not 1.8. - Services Configuration has now "Enabled:" again as english label for the checkbox. For = 3.0. This type of "bug fix" has been done to some other prefs editors previously by C=. Probably for the same reason. It doesn't hurt the user interface though. While doing this I found that a) memory was left lying around when adding a bad service b) an asl requester was freed twice while another wasn't freed at all on exit. Automatic reboot included. We are now at 37.13. - Enforcer hit in nipc.library fixed. I introduced this bug with my fixes for 40.25. Now we are at 40.26. - A minor problem with notification in the fs server. Notification was not done for the parent directory of the modified object. Notification for objects referenced with a lock and an empty file name could have been flaky. This should be ok now. I did not mention one other thing before: Notification should theoretically be done on all the hard links of the modified object, too. If you think about it hard, you will realise that this is not possible. This is not a bug. Anyway, the server is now up to 40.29. - This is embarassing. I left in debugging code that delayed a notification setup for > 1 second. Server is now at 40.30. - The AmiCDRom filesystem doesn't seem to set up its struct Resident correctly. This caused hits on volume insertion. I put a kludge into the fs server to compensate for this problem. Now at 40.31. - The client sets the DiskType in the volume nodes now. This should help "Filesystem Imports" to decide on already mounted mounts. Now at 40.41. - Minor typo fixes in some doc files and minor german locale update. - Filesystem Imports complained on empty drives even if the mount was ok. Fixed. It should be a lot better about determining which drives are already mounted, too. The original code had "crashy" tendencies for removable media and did not take device mounts into account. Now at 40.9. - Filesystem Imports will now check only active Envoy mounts to see if they are already mounted. Inactive mounts should be left alone for sure, now. Now at 40.10 - The efs client did some filehandle init it should not have done. Now at 40.42. - The efs client could give enforcer hits if someone did an UnLock() right after an Examine()/ExNext() in just the right timing. A lock was freed twice and invalid memory way referenced in that case. Also freeing a ZERO lock could probably result in unusual behaviour. As all the lock handling code turned out to have some perfectly valid, but obscure areas from the simple readability point of view, I did some beautification work in addition to fixing things. And while this is very ugly behaviour of any application, efs should now be robust against "copied" locks. This last thing is mainly a paranoia fix triggered by my research on the exnext problem which started this. Now at 40.43. - Found some places where lock pointers were set up without a check for the BPTR to be ZERO. This was always ugly and is deadly now. The efs client is up to 40.44 now. - nipc should no longer try to write to sana 2 devices which are definitely known to be offline. This should be cosmetic though. I am still not clear on what is causing problems with ppp.device. But maybe this reduction of io helps finding the actual problem. Now at 40.27. - After some thought I decided to modify the sana 2 device init in nipc to complain loud on any problems. I assume now that the user wants those devices she specified in Network Configuration to work well. Previously only a failure to open a device at all caused an requester to pop up. Now any "fatal" error which will prohibit nipc from setting up and using a device will generate a requester. This should reduce the "doesn't do anything after boot" problems without user notification by about 100%. And it should help fix bugs as you will get to see an error number. nipc.library is now at 40.28. - The EFS client returned ERROR_WRITE_PROTECTED instead of ERROR_DISK_WRITE_PROTECTED on an active ACTION_WRITE_PROTECT. This is fixed now and the EFS client is now at 40.45. - Bumped some versions to allow for a decent HWGRCS version freeze for release. I was unfortunately lazy sometimes. No change in functionality at all. Just a recompile with a new version number. filesystem.service: 40.32 Filesystem Imports: 40.11 Filesystem Exports: 40.9 nipc.library: 40.29 envoy.library: 37.21 services.library: 40.2 !! - I have a hunch concerning the ppp.device problem. It is now !! possible to disable ARP by setting the ARP type to the IP type. !! It counts as unsupported hack, though. I am not sure it will stay !! that way. This does not affect compatibility as it is a normally !! illegal combination of values anyway. Maybe ARP was the problem. !! If this was truly the problem, we need to either document this !! way to turn off ARP or find a more intuitive way to do this !! for the user. Hmm. What about an ARP type of 0 to turn off ARP? !! Hmm. Let's wait on feedback. nipc.library is now at 40.30. - The list of services was not correctly locked by nipc during an inquiry. This could lead to overwritten memory, crashes or similarly nasty things when the list changed at just the right time while an inquiry was active. nipc.library is now at 40.31. - The host requester in envoy.library had rather high stack usage. This should be better now. It could also mess up the system if you specified to many matchtags. This should be better, too. Now at 37.23. - Filesystem Imports had rather high stack usage, too. It also allocated a VisualInfo and never ever freed it. Now at 40.12. !! - Ok, this is it. The IMHO last change before releasing Envoy 2.0. !! The official way to turn ARP off is to set the ARP type to 0 !! now. nipc.library is now at 40.32. !! Not all sana 2 drivers can transmit ARP packets. ARP is !! usually useful on Ethernet, and maybe on ARCNET or amoknet. !! For other sana 2 devices, refer to the respective documentation. *** End Of Text ***